点对篇

end0fsky / 2024-10-15 / 原文

目录
  • finalize
  • enum
  • 注解
  • Optional
  • Consomer

finalize

没有被任何引用时,jvm会认为这个对象是一个垃圾对象,就会进行销毁,销毁前调用finalize方法

其中没有任何引用是指没有变量的地址值指向该变量,即该变量没有被任何的变量引用了

但不会立即销毁垃圾对象,而是会通过垃圾回收算法进行销毁的,以提高运行效率

也可以通过System.gc();主动触发,但只是有一定概率,可能被占用了,也可能因为其他原因

注意:不会造成线程阻塞,也就是说运行到该代码时,main线程会继续往下执行,这个方法中的代码由其他的线程执行

Student student = new Student();
student = null;

如上,student对象没有再引用原本的地址值了,

finalize只是其中的一个重写Object的方法,调用时并不会将对象销毁,只是在对象被销毁时被调用

可用于关闭IO流对象等操作

但几乎不会用,更多的是应付面试

enum

枚举类,是用于存储常量的类

格式

public enum Season {
    SPRING("春天","温暖"),
    WINTER("冬天","寒冷");
    
    public String name;
    public String desc;
    private Season(String name,String desc){
        this.name = name;
        this.desc = desc;
    }
}

其中常量必须在最上面,且每个之间用逗号相隔,最后一个要用分号

SPRING("春天","温暖"),

等效于类中的

public static final Season SPRING = new Season("春天","温暖");

枚举类中也可以写方法,其中非静态方法要通过Season.SPRING.xx();调用

枚举类的构造方法必须是private或者空,无法在非枚举类中创建枚举类的对象

枚举类不能使用extends关键字,原因:枚举类默认继承了Enum类(利用javap工具查看,与javac相反,是反编译工具)

javap(p是parse)工具,是java自带的工具,用于反编译class文件

反编译结果,其中所有的类名均是全类名,由于位置有限,所以我简化了

public final class Season extends Enum<Season>{
    public static final Season SPRING;
    public static final Season WINTER;
    public String name;
    public String desc;
    public static Season[] values();
    public static Season valueOf(String);
    static {};
}

若是使用了无参构造器,则小括号可以省略只用写名字

若枚举类中只有常量,最后的分号可以省略

enum A{
    s,q
}

其中他们的区别是他们的地址值,所以可以用a == b 进行判断

枚举类没有继承Object类

Enum类的equals方法是final修饰的,所以枚举类不能重写equals方法,只能用地址值进行比较,也可以调用枚举类对象(即常量)的字段进行比较,但实际上用==即可,因为枚举类对象是静态的

可以重写toString方法,父类的toString方法的返回值就是枚举类对象的名字

注解

SuppressWaring:可以将idea的警告(即标黄)给去除,在类,方法,语句上面使用

@SuppressWaring({""})
// 分号中填写需要抑制的警告信息
// all 所有警告
// boxing 与封装有关的警告
// null 与null值有关的警告
// ...
// 大括号中每一中警告相当于一个元素

Deprecated:当某个方法或类,字段等已经过时时使用,用于警告使用者已经有新的方法等代替了

Optional

Optional类是Java为了避免空指针异常而引入的一个类,可以保存对应泛型数据的值,或者保存null

实例化

of(T t);// 创建一个Optional实例,t必须非空
empty();// 创建一个空的Optional对象
ofNullable(T t);// t可以为空

判断是否包含对象

isPresent();// 判断是否包含对象
ifPresent(Consumer<? super T> consumer);// 如果有值,执行Consumer接口的实现代码,并将其中存储的值传给它

获取Optional容器的对象

get();// 如果调用对象包含值,返回该值,否则抛出异常
orElse(T other);// 如果有值则将其值返回,否者返回指定的other对象
orElseGet(Supplier<? extends T> other);// 如果有值将其返回,否则返回由Supplier接口实现提供的对象
orElseThrow(Supplier<? extends X> exceptionSupplier);// 如果有值则将其返回,否则抛出由Supplier接口实现的提供的异常

Consomer

Java 8 新特性

用于实现类似C#的委托的功能,可以接受Lambda表达式,以执行Lambda表达式