Java中 final、finally、finalize的区别

在Java中,final、finally和finalize这三个关键字虽然看起来相似,但实际上它们有着完全不同的含义和用途:

final

final关键字主要用于声明变量、方法或类为“最终的”或“不可变的”。

  1. 修饰变量,当用于变量时,它意味着变量一旦被初始化,其值就不能再被改变。对于引用类型,这意味着引用不能指向另一个对象,但对象的状态可能改变(除非对象中的所有字段也都是final)。
    1、基本数据类型:当final修饰一个基本数据类型变量时,该变量的值在初始化后就不能被改变。
 final int NUMBER = 10;
     // NUMBER = 20; // 这里会编译失败

2、引用类型:当final修饰一个引用变量时,该引用不能指向另一个对象,但是对象的内容仍然可以改变(除非对象本身也是不可变的)。

 final List<Integer> list = new ArrayList<>();
     // list = new ArrayList<>(); // 这里会编译失败
     list.add(1); // 这是允许的,因为改变的是list的内容,而不是list引用本身
  1. 修饰方法,当用于方法时,它防止该方法在子类中被重写。
    当final修饰一个方法时,该方法不能在子类中被覆写(override)。
  class Base {
         final void myMethod() {
             System.out.println("Base method");
         }
     }
     
     class Derived extends Base {
         // 下面的代码会编译失败,因为myMethod()是final的,不能被覆写
         // @Override
         // void myMethod() {
         //     System.out.println("Derived method");
         // }
     }
  1. 修饰类,当用于类时,它禁止任何类继承这个类。
    当final修饰一个类时,该类不能被继承。
final class MyClass {
         // 类的实现
     }
     
     // 下面的代码会编译失败,因为MyClass是final的,不能被继承
     // class AnotherClass extends MyClass {
     // }
  1. 构造函数参数
    final也可以用于构造函数的参数,这可以保证参数在构造函数内部不会被改变。
class Example {
         private final String name;
         
         public Example(final String name) {
             this.name = name;
         }
     }
  1. 多线程中的不变性
    final变量在多线程环境中可以提供不变性,意味着一旦被初始化,其值就不会改变,从而避免了线程同步问题。
    使用final关键字有助于提高代码的可读性和维护性,同时也能够防止无意中的修改,增强代码的安全性。在设计类和方法时,如果确定某些元素不需要改变,使用final是一个好习惯。

finally

  1. finally是异常处理结构的一部分,通常与try和catch一起使用。
  2. finally块中的代码在try块执行完毕之后一定会执行,无论是否有异常发生或者是否执行了return语句。
  3. 它常用于释放资源,如关闭文件流或数据库连接,因为即使在异常情况下,finally块中的代码也能得到执行。

finalize

  1. finalize是Object类中的一个方法,它在垃圾回收器准备回收一个对象之前调用。
  2. 对象的finalize方法可以用来执行一些清理工作,比如关闭外部资源。
  3. 然而,finalize方法的调用不是确定的,依赖于垃圾回收器的实现,并且可能永远不会被调用。
  4. 现代Java实践中,由于finalize方法的不确定性和效率问题,它已被标记为过时,建议使用其他资源管理策略,如尝试-资源语句(try-with-resources)或显式关闭资源。

总结:

  1. final用于确保变量、方法或类的不可变性。
  2. finally用于确保在异常处理中总能执行一段代码,常用于资源清理。
  3. finalize是一个方法,用于对象被垃圾回收前的清理工作,但其使用已不推荐,应寻找替代方案。
    在编写代码时,了解这些关键字和方法的区别以及它们的正确使用场合非常重要。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: final 是一个修饰符,能够用于类、变量和方法,表示它们不能被修改或重写。finally是一个关键字,它在异常处理语句使用,表示肯定会被执行的代码。finalize是一个Object类的方法,在垃圾收集器准备回收对象时会调用该方法,用于清理资源。 ### 回答2: 在Javafinalfinallyfinalize是三个不同的关键字,具有不同的用途和含义。 1. finalfinal是一个修饰符,用于声明一个不能被继承的类、一个不能被重写的方法、或者一个不能被修改的变量。当一个类被声明为final时,该类不能被其他类继承。当一个方法被声明为final时,该方法不能被子类重写。当一个变量被声明为final时,该变量的值不能被修改。 2. finallyfinally是一个关键字,用于定义在try-catch语句块的一个代码块,无论是否发生异常,该代码块都会被执行。finally块通常用于释放资源,比如关闭文件、网络连接等。 3. finalizefinalize是一个方法,用于在Java对象被垃圾回收器销毁之前进行一些清理工作。finalize方法的定义在Object类,可以被子类重写。finalize方法在垃圾回收器准备销毁对象时会被调用,但并不能保证一定会执行,因为垃圾回收是由垃圾回收器自行决定的。 总结: final用于修饰类、方法或变量,表示不可继承、重写或修改。finally用于定义在try-catch语句块的一个代码块,无论是否发生异常,都会执行。finalize是一个方法,在Java对象被销毁之前执行一些清理工作,但不能保证一定会被执行。 ### 回答3: 在Javafinalfinallyfinalize是三个不同的概念。 1. finalfinal是一个关键字,可以修饰变量、方法和类。当用final修饰变量时,表示该变量的值不可被更改。当用final修饰方法时,表示该方法不可被子类重写。当用final修饰类时,表示该类不可被继承。final主要用于限定对象的状态、行为或结构的不可改变性。 2. finallyfinally也是一个关键字,用于定义在try-catch结构的一个代码块。无论try块是否发生异常,finally的代码都会被执行。通常用finally来释放资源、关闭文件、数据库连接等必要的清理操作。 3. finalizefinalize()是一个方法名,属于Object类的一个方法,用于Java的垃圾回收机制。当一个对象变成垃圾,即没有任何引用指向该对象时,垃圾回收器会在适当的时机调用该对象的finalize()方法,进行资源释放和清理操作。但是,由于finalize()方法的执行时机不确定,并且Java8已经不鼓励使用finalize()方法,因此一般不建议使用该方法。 总结:final表示不可改变性,finally表示无论是否发生异常都会执行的代码块,而finalize是垃圾回收器在释放对象时调用的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值