1、final 修饰符:final 可以用于修饰类、方法和变量。
- 修饰类:表明该类不可被继承,无法派生新的子类。
- 修饰方法:该方法不能被重写。
- 修饰变量:只能在申明变量时或构造方法中赋值,一旦赋值了就不能在改变。
2、finally
在使用try{} catch(){} 时可以在其后加上finally{}也可以不加。如果加上,无论是否发生异常都会执行finally快中的代码,因此我们可以在其中处理资源的释放。
3、finalize方法
finalize方法是Object中的方法,因此所有的类都具有这个方法,它类似于C++的析构函数。在java中如果垃圾收集器发现一个对象不存在任何的引用指向它(或者说是不可达的),就会去回收这个对象,在回收之前会调用该对象的finalize方法,但是JVM不保证这个方法总被调用。通常我们不会使用这个方法,java也不建议使用。
关于finalize方法补充:
在垃圾回收器回收对象之前会调用finalize方法,因此我们可以通过这个方法让对象自我救赎,只需要在该方法中让一个引用重新指向它,这样对象就不会被回收了。不过需要注意的是该方法只会运行一次,如果下次垃圾回收器执行时,再检测到没引用指向它,不会再调用finalize方法了。
finalize()方法会执行的两个条件:
- 重写了finalize()方法。
- finalize()方法之前没被调用过。
//User.class
public class User{
@Override
protected void finalize() throws Throwable {
System.out.println("finalize方法执行...");
//让一个引用指向它
Main.user=this;
}
}
//Main .class
public class Main {
public static User user;
public static void main(String[] args) throws InterruptedException {
user=new User();
user=null;//此时没有引用指向User对象
System.gc();//运行垃圾收集器
TimeUnit.SECONDS.sleep(2);
if (user!=null){
System.out.println("我被拯救了,user重新指向我");
}else {
System.out.println("我没被拯救");
}
user=null;
System.gc();//运行垃圾收集器
TimeUnit.SECONDS.sleep(2);
if (user!=null){
System.out.println("我被拯救了,user重新指向我");
}else {
System.out.println("我没被拯救");
}
}
}
打印:
finalize方法执行...
我被拯救了,user重新指向我
我没被拯救