点对篇
- 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表达式