final的用法
final意为最终的、不可更改的。final是定义Java中类、方法以及变量修饰符的关键字,它有以下使用场景。
- 修饰变量
由于final的不可变特性,所以当final定义变量时,需要赋予初始值,定义完成后这个变量就相当于常量,所以开发时我们一般用它来定义常量,比如π。 - 修饰属性
- 属性是全局变量,存储在堆内存中对象空间内的一个小空间里,虽然一般来说,堆内存的变量如果不赋值的话,会有一个默认值,但是由于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数组中的值
}
}
- 修饰方法
由于final不可变特性,由final修饰的方法不可以被子类重写。 - 修饰类
当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回收时,默认调用执行的方法。
protected void finalize() throws Throwable { }
三者的区别
综上所述,三者很容易区分,首先final这个关键字使我们最经常接触的,所以他的用法在上面要好好记住,其次finally是跟try/catch相关的,记的时候跟他们联系起来就好了,最后finalize是Object类的一个方法,把它和GC垃圾回收机制联系起来就好了。