final、finalize 和 finally 的区别


💖The Begin💖点点关注,收藏不迷路💖

在Java编程语言中,final、finalize和finally都是关键字,但它们各自拥有不同的用途和含义。下面我们将逐一介绍这三个关键字,并解释它们之间的区别。

1、final

final是一个修饰符,它可以用来修饰类、方法或变量。其主要目的是表示某种“不可变性”。

1.1 修饰类

当final修饰一个类时,这个类就不能被继承。即,你不能创建该类的子类。

final class FinalClass {  
    // ...  
}  
  
// 尝试继承FinalClass将会导致编译错误  
class AnotherClass extends FinalClass {  
    // 编译错误:FinalClass是final的,不能被继承  
}

1.2 修饰方法

当final修饰一个方法时,这个方法就不能被子类重写。即,子类不能提供该方法的不同实现。

class Parent {  
    final void finalMethod() {  
        // ...  
    }  
}  
  
class Child extends Parent {  
    // 编译错误:finalMethod()在Parent中已被声明为final,不能被重写  
    void finalMethod() {  
        // ...  
    }  
}

1.3 修饰变量

当final修饰一个变量时,这个变量的值在初始化之后就不能被改变。对于引用类型的变量,这表示引用本身不能被改变(即不能再指向其他对象),但引用的对象内部的状态是可以改变的。

final int finalVariable = 10;  
// finalVariable = 20; // 这会导致编译错误,因为finalVariable的值一旦被初始化就不能再改变  
  
final StringBuilder sb = new StringBuilder("Hello");  
sb.append(" World"); // 这是允许的,因为只是改变了对象的状态,而不是改变了引用本身

2、finally

finally是异常处理结构try-catch-finally的一部分。无论是否发生异常,finally块中的代码都会被执行。这通常用于执行清理操作,如关闭文件、数据库连接等。

try {  
    // 尝试执行一些可能会抛出异常的代码  
} catch (Exception e) {  
    // 处理异常  
} finally {  
    // 无论是否发生异常,这里的代码都会被执行  
    // 执行清理操作,如关闭文件、数据库连接等  
}

3、finalize

finalize是Object类的一个方法,它在对象被垃圾收集器回收之前调用。然而,不建议在应用程序中依赖finalize方法来进行资源清理。

因为Java的垃圾收集器是不确定性的,也就是说,你无法知道垃圾收集器何时会运行,这可能导致资源释放被延迟。从Java 9开始,finalize方法已经被标记为已弃用(deprecated),并在Java 12中被移除。

相反,应该使用try-with-resources语句或显式地在不再需要资源时关闭它们。

例如,对于实现了AutoCloseable或Closeable接口的资源(如文件流、数据库连接等),可以使用try-with-resources语句来自动管理资源的关闭。

public class FileReaderExample {  
    public static void main(String[] args) {  
        // 尝试使用try-with-resources语句读取文件  
        try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {  
            // 使用br进行文件读取操作  
            String line;  
            while ((line = br.readLine()) != null) {  
                System.out.println(line); // 打印文件的每一行  
            }  
              
            // 注意:这里不需要显式调用br.close(),因为try-with-resources会自动处理  
            // 当try块结束时,br会被自动关闭  
              
        } catch (IOException e) {  
            // 处理异常  
            e.printStackTrace(); // 打印异常的堆栈跟踪  
            System.err.println("读取文件时发生错误。"); // 向标准错误输出错误信息  
        }  
          
        // 在这里,br已经被自动关闭,无需再调用close()方法  
        // 你可以继续执行其他代码,而不用担心资源泄露  
    }  
}

4、总结

1、final 用于声明属性、方法和类,表示属性不可变、方法不可覆盖和类不可继承。

2、finally 是异常处理语句结构的一部分,用于确保代码块无论是否发生异常都会被执行。

3、finalize 是 Object 类的方法,用于在对象被垃圾回收前进行资源清理。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖
  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值