Final关键字、finally关键字、finalize关键字详解
final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的。这里从final关键字在数据域、方法和类中三个方面分析final关键字的主要用法。
一、final概述
概念:由字面可以了解,final有最终态,无法改变的意思。
使用目的:为了阻止改变与提高效率。
高效原因:Java内嵌机制,final方法会在编译的过程中利用内嵌机制进行inline优化。
inline优化是指:在编译的时候直接调用方法代码替换,也就是内嵌,而不是在运行时调用方法。
inline需要在编译的时候就知道最后要用哪个方法。
然而,非final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段
并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。)
修饰对象:
1、非抽象类,由于被final修饰的类是不能被继承的,而抽象类必须被继承才有意义。
2、非抽象方法,由于被final修饰的方法是不能被重写的,而抽象方法必须被重写才有意义。
3、变量或常量。
注意:
1、final不能修饰构造方法。
2、父类的private方法是不能被子类重写的,因为private方法默认是final的。
Final修饰参数或者变量(重点)
说明:论属性是基本类型还是引用类型,final所起的作用都是变量里面存放的“值”不能变。
(1)基本数据类型
1、对于基本数据类型final使数值恒定不变,是实实在在的的值,这与引用类型的不同。
2、一个既是static又是final的域只占据一段不能改变的存储空间。(public static final int VALUE)将数据定义为static强调只有一份,定义为final,则说明它是一个常量。
3、Java允许声明为final但又未给定初值的域(空白final),但必须确保在使用前被初始化。(必须在域的定义[声明时,初始化块中]或者每个构造器初始化时对final进行赋值,但是只要初始化过,就无法再次赋值修改,否则编译报错)。
4、在方法中将参数声明为final,意味着无法在方法中更改参数的值,但是可以读取该参数。(主要用来向匿名内部类传递数据)
(2)引用类型
1、引用类型变量里面放的是个地址,所以用final修饰引用类型变量指的是它里面的地址不能变,并不是说这个地址所指向的对象或数组的内容不可以变(内容值可以变)。
例如:类中有一个属性是final Person p=new Person("name"); 那么你不能对p进行重新赋值,但是可以改变p里面属性的值,p.setName('newName');
其他方面与基本数据类型类似。
final方法
1、使用final修饰方法时,可以把方法锁定,以防任何继承类修改它的含义。这是出于设计的考虑。(虽然不可以被继承,但是依然可以被子类调用,该父类方法不可以是private方法)
2、方法被修饰为final时,就是同意编译器将针对该方法的所有调用都转换为内嵌调用。
3、所有的private方法都隐式地指定为final的(但是子类是无法调用父类的private方法的)。
final类
1、当某个类整体定义为final时,就表明你不打算继承该类,而且也不允许别人这样做。(常见不可被继承的类,即被final修饰的类,如:String类,Integer类,Math类等等,具体可以查看JAVA源码)
参考资料:
https://blog.csdn.net/zhangliangzi/article/details/50604976
https://blog.csdn.net/zq602316498/article/details/38762419
二.Finally
如何使用:
1.finally或catch语句一定会伴随try语句出现。
2.try语句不能单独使用,必须配合catch语句或finally语句。
3.try语句可以单独与catch语句一起使用,也可以单独与finally语句一起使用,当然也可以三者一起使用。
用途:
1、 finally关键字用于try后面,finally块中的代码总是执行,不论是否发生异常。一般用于清理工作、关闭链接等类型的语句,如:文件流作为一种资源,在使用完毕之后要进行流的关闭,否则会造成资源的浪费的。
注意:
(1)try语句块里面有System.exit(0)这条代码,所以finally语句块里面的输出语句块是无效的,因为System.exit(0);执行会退出JVM,所以底下的代码是不会执行的。
(2)在执行return之前,会执行finally块中的程序。
三、Finalize(待补充)
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收。