一、final关键字
final 是一个修饰符,在java中它可以修饰类、方法、变量。一旦你将引用声明做final,你将不能改变这个引用了,如果你视图将变量再次初始化的话,编译器会报编译错误。final的含义在不同的场景下有细微的差别,但总体来说,它指的是“不可变”。
final 修饰类时表明这个类不可以被继承。
final 修饰方法时表明这个方法不可以被其子类重写。
final 修饰变量时可分为局部变量、实例变量和静态变量,当 final修饰变量时,该变量的值在初始化后不能发生改变。 修饰局部变量时,该局部变量可以被一次赋值(可以选择在初始化时赋值或在需要位置赋值,但只能选择一个地方赋值一次),以后该变量的值不能发生改变;当 final 修饰实例变量时,实例变量必须由程序员在构造器、初始化块、定义时这 3 个位置的其中之一指定初始值;当 final 修饰静态变量时,静态变量必须由程序在静态初始化块、定义时这 2 个位置的其中之一指定初始值。
finally 是异常处理语句结构的一部分,表示总会执行的代码块。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收。但实际上重写该方法进行资源回收并不安全,因为 JVM 并不保证该方法总被调用。
二、final关键字修饰引用类型
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的
内容还是可以改变的。例如,对于如下语句:
final StringBuilder a = new StringBuilder ("immutable");
执行如下语句将报告编译错误:
a = new StringBuilder ("");
但如下语句则是完全正确的
a.append("fkjava.org");
有人希望在定义方法的形参时,通过 final 修饰符来阻止方法内部修改传进来的实参:
public void method(final StringBuilder param)
{
}
实际上这没有用,在该方法内部仍然可以增加如下代码来修改实参对象:
param.append("fkjava.org");
造成这种差异是由于基本类型和类(引用)类型在使用时值传递和引用传递的差异造成,引用传递储存的是对象实际存储空间的地址,所以final修饰后只是引用指向不能改变,但是指向对象的内容仍然可以改变。
四、final关键字修饰类
使用 final 修饰的类都不可以被继承。
实际上即使自己开发的类,也可以通过使用 final 修饰来阻止被继承。通过使用 final 修饰的类被称为最终类,最终类不能派生子类,这样该类就被完全地封闭起来了,不会有子类来重写它的方法,因此更加安全。
来源:oschina
链接:https://my.oschina.net/fairy1674/blog/3182949