Java中的final,finally,finalize关键字

我的梦境 提交于 2020-03-01 20:16:57

一、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 修饰的类被称为最终类,最终类不能派生子类,这样该类就被完全地封闭起来了,不会有子类来重写它的方法,因此更加安全。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!