天天看点

Java中final、finally和finalize三者的用法及区别

final的用法

final意为最终的、不可更改的。final是定义Java中类、方法以及变量修饰符的关键字,它有以下使用场景。

  1. 修饰变量

    由于final的不可变特性,所以当final定义变量时,需要赋予初始值,定义完成后这个变量就相当于常量,所以开发时我们一般用它来定义常量,比如π。

  2. 修饰属性
  • 属性是全局变量,存储在堆内存中对象空间内的一个小空间里,虽然一般来说,堆内存的变量如果不赋值的话,会有一个默认值,但是由于final的不可变特性,如果不赋值的话理论上他会将默认值作为自己的值,并且固定不变这对于我们来说是毫无意义的,但其实如果final修饰的属性不赋值,他编译时就会报错。
  • final修饰属性的时候,属性还有一个数据类型,如果属性的数据类型是基本数据类型,那么final修饰后属性值不会发生改变;如果属性的数据类型是引用数据类型,那么final修饰后属性所引用的对象地址不能改变,但是这个对象里面的变化就不归final管了。(针对这一点使用以下代码举例)
public class Person{
	public final char[] name = {'I','T','小','白'}//利用引用类型的char数组来存放名字
	public final int age = 18;//利用基本数据类型的int存放年龄

	public static void main(String[] args){
		Person person = new Person();
		System.out.println("名字是:"+"person.name"+"年龄是:"+"person.age");
		//这时改变name数组中的值
	}
}
           
  1. 修饰方法

    由于final不可变特性,由final修饰的方法不可以被子类重写。

  2. 修饰类

    当final修饰类本身的时候,很不幸o(╥﹏╥)o,这个类绝后了,成了一个太监类,专业术语叫无法被子类继承,也就没有子类。

    而我们通常常见的“太监类”多数为工具类,例如:Math、Scanner、Integer、String等

finally的用法

finally的出场要伴随着try和catch,finally是他们的一个可有可无的分支来先看一下这个结构,如下:

try {
		Thread.sleep(200);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}finally{
		System.out.println("或许我可有可无,但是一旦存在就必须执行!");
	}
           

finalize的用法

finalize()是Object的一个方法,作用在对象被GC回收时,默认调用执行的方法。

三者的区别

综上所述,三者很容易区分,首先final这个关键字使我们最经常接触的,所以他的用法在上面要好好记住,其次finally是跟try/catch相关的,记的时候跟他们联系起来就好了,最后finalize是Object类的一个方法,把它和GC垃圾回收机制联系起来就好了。