您的位置:首页 > 编程语言 > Java开发

Java学习笔记(四)--final,finally,finalize的区别

2018-03-06 19:16 651 查看

前言

     初次一看,他们长得好像啊,但是千万不要被表象迷惑了呀!他们可不是三胞胎兄弟呀!他们分别表示什么请继续往后看。

final

      final是一个修饰符,用来修饰变量,方法和类,分别表示属性不可变,方法不可被重写,类不可被继承,特性如下:

final修饰的成员变量需要程序员显示的指定初始值,  类变量必须在声明该类变量时指定初始值或在静态初始化块中指定初始值。实例变量必须在声明该实例变量时指定初始值或非静态初始化块,构造器中指定初始值
final声明的变量可执行"宏替换",举个例子:

/**
* Created by huan on 2018/3/6.
* final修饰符
*/
public class StringJoinTest {
public static void main(String[] args) {
String s1 = "疯狂Java";
String s2 = "疯狂" + "Java";
//①s2在编译时即可确定s2为"疯狂Java",所以为true
System.out.println(s1 == s2);
String str1 = "疯狂";
String str2 = "Java";
//final修饰可达到宏替换
//      final  String str1 = "疯狂";
//      final  String str2 = "Java";
String s3 = str1 + str2;
//②s3在编译时不会执行宏替换,也不知道s3是"疯狂Java",所以是false
System.out.println(s1 == s3);
}
}

分析

      执行结果分别是true,false,先声明s1,这时在内存中就会存储一个"疯狂Java",当声明s2时,在编译期间就可以确定s2是"疯狂Java",所以就会指向和s1同一块内存,因此s1 == s2,声明的s3是两个新变量str1和str2的和,在编译期间s3并不是"疯狂Java",而且也不能进行宏替换,所以s1 ==s3执行结果是false。如果想让s1 == s3怎么做呢?就是声明的str1和str2使用final修饰符修饰。

  final修饰的方法不能被重写,这可以用于一些继承中,子类可以获得父类的方法,并且修改其中的实现,但是我们为了某些安全性,父类的方法不想被子类重写,这时候使用final修饰父类的方法就可以达到子类不能重写父类该方法的目的。
final修饰的类不能被继承

finally

    finally是异常处理语句结构的一部分,表示总是执行。

finalize

    该方法时垃圾回收机制中使对象成为可恢复状态的方法,在垃圾回收机制回收任何对象之前,会先调用它的finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而可以使垃圾回收机制取消回收。举个例子: /**
* Created by huan on 2018/3/6.
* 垃圾回收
*/
public class FinalizeTest {
private static FinalizeTest ft = null;
public void info(){
System.out.println("测试资源清理的finalize方法");
}
public static void main(String[] args) throws Exception{
//创建FinalizeTest对象立即即进入可恢复状态
new FinalizeTest();
//通知系统进行资源回收
System.gc();
//强制垃圾回收机制调用可恢复对象的finalize()方法
// Runtime.getRuntime().runFinalization();
System.runFinalization();
ft.info();
}
public void finalize(){
//让ft引用到试图回收的可恢复对象,即可恢复对象重新编程可达
System.out.println("执行finalize");
ft = this;
}
}

分析

     通知系统要资源回收(System.gc()),因为下方ft.info()又引用了这个类,所以需要调用finalize方法让ft恢复对类FinalizeTest的引用。这样就不会出现空指针的错误。

总结

    他们在java中各司其职,并不是长的像就一定是一家人哦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java基础