final、finally、finalize的区别

整理:解析final、finally、finalize的区别

区别

  1. final 是java中的关键字,表示这部分是“不可修改的”。使用final可以修饰:变量、方法、类。表示变量不可变,方法不可以被覆盖,类不可以被继承。
  2. finally 是java中异常处理结构的一部分,表示这段代码总会被执行。
  3. 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还没有研究,暂不写,日后再补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值