很多编程语言都存在两个或以上相似关键字的情况。初次接触编程的人可能会对此产生疑惑。但对于稍有经验的人,即使无法即兴说一段教科书般的解释,他们心里也是非常清楚这些关键字的差别的。因为真的很简单。
Java中的“final”、“finally”、“finalize”就是一组相似的关键字。
final
“final”表示不可修改。它可以用来修饰类、方法、变量。
- final 修饰类,表示该类不可以被继承;
- final 修饰方法,表示该方法不可以被重写(override);
- final 修饰变量,表示该变量不可以被修改
- 如果变量是原始数量类型,如 int、long、boolean,则表示该变量的值不可以被修改
-
如果变量是引用类型,则表示该变量只能表示已声明赋予它的对象,不能指向其它对象;但与目标对象内部数据是否可修改无关。
例,final A a = myA;,a 只能表示 myA 这个实例,但是对 myA 中属性 x 的修改不受此处的 final 限制
一个必须使用 final 的常见的场景
匿名内部类访问局部变量时,内部类会 copy 一份这个局部变量;所以为了防止出现数据不一致的情况,需要将该局部变量声明为 final
合理使用 final
final 的正确用法就是其语义。即,从业务或实现角度而言,某些类、方法或变量是不允许被修改的,有必要用 final 来保护它们,那就可以用 final。
虽然“不可被修改”这个特性或许可以稍微提高某些场景的性能,但这类“小技巧”通常是未经验证过推测。
另外,JVM 是比较智能的,这类小技巧必要性很小,不要在日常开发中使用。
程序最好体现其语义目的,而不应被性能目的绑架到“面目全非”。
finally
“finally”是 Java 保证重点代码一定要被执行的一种机制。它以 try-finally 或 try-catch-finally 的形式使用。
如,在 finally 语句块中关闭 JDBC 连接、关闭某些同步锁等。
当然,对于实现了 java.lang.AutoCloseable 接口的对象,try-with-resources 的写法也是非常值得使用的资源释放形式。
BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { if (br != null) br.close(); }
try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); }
特例:无法被执行的 finally
try { ... System.exit(1); } finally { ... }
finalize
“finally”是 java.lang.Object 类的一个方法。垃圾收集器会调用该方法以保证对象被收集前完成特定资源的回收。
这种机制已经不推荐使用,JDK 9 已经将其标记为 deprecated。
如果 try-finally 无法满足需求,可以考虑用 Cleaner 机制。
Cleaner 机制中,每个 Cleaner 的操作都是独立的,有自己的运行线程,可以避免意外死锁等问题。但无法避免幻象引用堆积。
public class CleaningExample implements AutoCloseable { // A cleaner, preferably one shared within a library private static final Cleaner cleaner = <cleaner>; static class State implements Runnable { State(...) { // initialize State needed for cleaning action } public void run() { // cleanup action accessing State, executed at most once } } private final State; private final Cleaner.Cleanable cleanable public CleaningExample() { this.state = new State(...); this.cleanable = cleaner.register(this, state); } public void close() { cleanable.clean(); } }
相关推荐
Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理
在Java编程语言中,`final`, `finally`, 和 `finalize` 是三个非常重要的关键字,它们各自扮演着不同的角色,尤其在处理程序的可预测性、数据的不可变性和垃圾回收等方面。下面将详细阐述这三个关键字的区别及其应用...
java中final, finally, finalize 的区别
在Java编程语言中,"final", "finally", 和 "finalize" 这三个关键字有着截然不同的含义和用途,它们各自在程序设计的不同层面扮演着重要角色。深入理解这些概念对于编写高效、健壮的Java代码至关重要。 ### final ...
Java编程中的`final`, `finalize`, 和`finally`是三个重要的关键字,它们各自在不同的场景下发挥着关键作用。理解这三个关键字的区别对于Java开发者来说至关重要,尤其是在面试中常常会被问及。 首先,`final`是一...
Java 基础之 final、finally 和 finalize 的区别 Final、finally 和 finalize 是 Java 语言中三个常用的关键字,然而它们的作用和用法却有很大的区别。下面我们将详细介绍这三个关键字的区别。 Final Final 是一...
Java编程中的`final`、`finally`和`finalize`关键字对于理解Java程序的运行机制至关重要。它们各自有独特的用途和特点。 首先,`final`关键字是Java中的一个多面手,它可以用于修饰类、方法和变量。当`final`用于...
Java面试题-基础+集合原理 本资源主要涵盖Java面试题的基础知识和集合原理,涵盖Object-Oriented Programming(OOP)相关知识点,包括多态(Polymorphism)、方法Overload和Override、等于运算符(==)和equals()...
对于Java中final、finally、finalize的有关问题做下的思维导图,便于深化记忆,希望对你有帮助!注意:文件为.mm后缀建议下载freemind打开,免费的思维导图软件!
Java中的`final`、`finally`和`finalize`都是关键字,但它们的作用和用途各不相同,对于初学者来说,理解这些概念可能会有些困难。让我们逐一解析它们。 **final** `final`是一个修饰符,主要用于以下几个方面: ...
【Java核心技术】final、finally和finalize是Java编程中三个重要的关键字,它们各自有着独特的功能和用法。 **final关键字** final在Java中扮演着“不可改变”的角色。它可以用来修饰类、方法和变量: 1. **修饰类...
Java 技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去 之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对 象调用的。它是在Object 类中定义的,因此所有的类都...
"Java-基础/jvm/多线程"这个主题涵盖了Java语言的基础知识,包括JVM(Java虚拟机)、多线程以及Java的基础语法和特性。 1. **JVM、JRE和JDK的关系**: - JVM(Java Virtual Machine)是Java程序运行的平台,负责...
Java面试中的问题涵盖了许多核心概念和技术,这些都是Java开发者必须掌握的基础知识。以下是对这些知识点的详细解释: 1. **String对象创建**: 当我们创建`String s = new String("xyz");`时,实际上是创建了两个...
根据给定文件的信息,我们可以提炼出一系列与Java基础及面试相关的知识点,并进行详细的解析: ### 1. Spring、Hibernate、Struts的关系 Spring、Hibernate 和 Struts 是三个非常流行的 Java 框架,它们在 J2EE ...
1. **final、finally、finalize的区别** - `final`:这是一个修饰符,用于声明不可变的类、变量和方法。当一个类被声明为final,意味着它不能被继承;一个final变量一旦初始化后,就不能再改变其值;final方法不能...
final, finally, finalize - `final`关键字用于声明不可变的变量、方法或类。 - `finally`块确保在try-catch语句中无论是否发生异常,都会执行的代码。 - `finalize`是Object类的一个方法,用于垃圾回收前的清理...
final、finally与finalize - **final**:如上所述,用于声明常量、不可变对象及不可继承类。 - **finally**:确保一段代码无论发生什么异常都会被执行,通常用于资源释放场景。 - **finalize**:对象的析构函数,...
1. **final, finally, finalize的区别**: - `final`:用于声明类、变量或方法,表示不可变性。当用来修饰类时,禁止子类继承;修饰变量时,变量一旦初始化后不可改变;修饰方法时,防止该方法被子类重写。 - `...