整理:解析final、finally、finalize的区别
区别
- final 是java中的关键字,表示这部分是“不可修改的”。使用final可以修饰:变量、方法、类。表示变量不可变,方法不可以被覆盖,类不可以被继承。
- finally 是java中异常处理结构的一部分,表示这段代码总会被执行。
- finalize() 是在java.lang.Object中定义的方法,即所有类都这个方法。//还不太清楚
final用法
1 修饰变量
一旦将变量设置成final,则不能更改final变量的值(可以把它当作常量)
class Test{
final String name = "zuozuozuo";
}
当final修饰的是一个基础数据类型时,则该基础数据类型一旦在初始化之后就不能再发生变化;当final修饰的是引用数据类型时,则在其被初始化之后,就不能再指向其他对象了,但是它指向的对象的内容还是可以发生变化的,此时final修饰的引用变量不可变,引用变量的值是指向的地址,即地址的值不变,而地址中的类是可以变化的。
注意:接口中声明的所有变量都是final的。
在java中,String被设计成final类,下面是String的源码
// 在java8中,String内部使用char数组存储数据
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
// 在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 coder 来标识使用了哪种编码。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final byte[] value;
/** The identifier of the encoding used to encode the bytes in {@code value}. */
private final byte coder;
}
//value 数组被声明为 final,这意味着value数组初始化之后就不能再引用其它数组。
//并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。
修饰方法
如果任何方法被final修饰,将方法锁定,不能重写它
class A{
final void name(){
System.out.println("Helloz");
}
}
当定义以上类的子类时,name方法不能被覆盖,否则编译出错。
注意: 如果父类中的final方法访问权限时private,将会导致子类中不能直接继承该方法,此时,可以在子类中定义相同方法名的函数,不会与重写final的矛盾,而是在子类中定义了新的方法。
修饰类
当使用final修饰类的时候,表明该类不能被其他类继承。注意哦:final类中的所有成员方法都会隐式地定义为final。
finally用法
finally是java中异常处理结构的一部分,只能被用在try/catch语句中,finally确保⼀段代码不管发⽣什么异常状况都要被执⾏。
补充:finally和return的执行顺序
当try{}里面出现return语句时,后面的finally是否会被执行呢?答案是会,而且是先执行finally语句,再执行return语句。因为return表示整个方法体返回,所以finally一定在这之前就已经执行了。
但是,对于finally语句中,对数据的修改,数据是引用类型还是值类型,效果是不同的。
//值类型
static int f1(){
int ret = 1;
try{
return ret; // 1,finally中的ret++没有作用
}finally {
ret++;
System.out.println("finally被执行啦!");
}
}
//引用类型
static int[] f2(){
int[] ret = new int[]{1};
try{
return ret; //[2] ,finally中的ret[0]++有作用
}finally {
ret[0]++;
System.out.println("finally又被执行啦!");
}
}
finalize()用法
finalize()是java.lang.Object类中定义的一个方法,(Object下共定义了12个方法),finalize在垃圾回收时被调用。由于JVM还没有研究,暂不写,日后再补。