final,finally,finalize区别

本文详细解析了Java中的final、finally与finalize的概念及使用方法。final可用于修饰变量、方法和类,限制它们的可变性或继承性。finally主要用于确保在try-catch语句块之后总是执行特定代码,即使出现异常也不例外。finalize则是Object类的方法,用于垃圾回收前的资源清理。
摘要由CSDN通过智能技术生成

一,final

final可以用于修饰变量,方法,类。

1,当修饰变量时,如果是成员变量,必须在声明的时候或者在构造器初始化,如果是本地变量,在声明的时候赋值。

2,修饰方法时,代表方法不能被重写。

3,修饰类的时候,代表这个类不能被继承,

二,finally

finally是在异常处理里用到的

除了下面两种情况finally不会执行。

1:在进入try块之前就出现了异常,会直接结束;2:在try块中强制退出时不会执行finally块。

其他情况finally始终执行。

那么执行的顺序是什么呢?

如果try块中有return 表达式;那么finally是在return的表达式执行完,此时不会return,在finally块执行完再return,但是如果finally块中有return,会直接return。如果表达式返回的是基础类型,finally里的语句不会改变返回值,如果是引用类型,finally块里如果改变了引用的对象的属性值,会改变返回值。下面根据每种情况给出例子:

1,try块有return,finally块的执行顺序

public class Main{
    public static void main(String[] args) {
        System.out.println(testFianlly());
    }
    public static int testFianlly(){
        try{
            return 1+1;
        }catch (Exception e){
            return 0;
        }finally {
            System.out.println("finally");
        }
    }
}

输出结果:

finally

2

2,finally块里有return,会直接返回。

public class Main2 {
    public static void main(String[] args) {
        System.out.println(testFianlly());
    }
    public static int testFianlly(){
        try{
            return 2;
        }catch (Exception e){
            return 0;
        }finally {
            System.out.println("finally");
            return 3;
        }
    }
}
输出结果:

finally

3

3,try块返回的是基础类型,finally块里对其修改,不会影响返回的值。

public class Main2 {
    public static void main(String[] args) {
        System.out.println(testFianlly());
    }
    public static int testFianlly(){
        int res=0;
        try{
            return res+4;
        }catch (Exception e){
            return 0;
        }finally {
            res+=3;
            System.out.println("finally");
        }
    }
}
输出结果:

fianlly

4

4,try块里return的是引用类型,fianlly块里对其修改会影响对象的值,因为改变的是对象,返回的是引用,引用找到对象,但是对象在finally里已经被改变了。

public class Main2 {
    public static void main(String[] args) {
        System.out.println(testFianlly());
    }
    public static Person testFianlly(){
        Person person = new Person("gch",24);
        try{
            return person;
        }catch (Exception e){
            return null;
        }finally {
            person.setName("cxh");
            System.out.println("finally");
        }
    }
}
class Person{
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
输出结果:

finally
Person{name='cxh', age=24}


三,finalize

finalize是Object类的一个方法,不是一个关键字,只是和前面两个长得像而已。

finalize方法是垃圾回收时被调用的。一旦垃圾回收器准备好释放对象占用的空间时,将首先电泳其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值