`

【Java核心-基础】final,finally,finalize

    博客分类:
  • Java
 
阅读更多

很多编程语言都存在两个或以上相似关键字的情况。初次接触编程的人可能会对此产生疑惑。但对于稍有经验的人,即使无法即兴说一段教科书般的解释,他们心里也是非常清楚这些关键字的差别的。因为真的很简单。

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学院整理

    java面试题 谈谈final, finally, finalize的区别

    在Java编程语言中,`final`, `finally`, 和 `finalize` 是三个非常重要的关键字,它们各自扮演着不同的角色,尤其在处理程序的可预测性、数据的不可变性和垃圾回收等方面。下面将详细阐述这三个关键字的区别及其应用...

    final, finally, finalize的区别

    在Java编程语言中,"final", "finally", 和 "finalize" 这三个关键字有着截然不同的含义和用途,它们各自在程序设计的不同层面扮演着重要角色。深入理解这些概念对于编写高效、健壮的Java代码至关重要。 ### final ...

    详解Java编程中final,finalize,finally的区别

    Java编程中的`final`, `finalize`, 和`finally`是三个重要的关键字,它们各自在不同的场景下发挥着关键作用。理解这三个关键字的区别对于Java开发者来说至关重要,尤其是在面试中常常会被问及。 首先,`final`是一...

    java 基础之final、finally和finalize的区别

    Java 基础之 final、finally 和 finalize 的区别 Final、finally 和 finalize 是 Java 语言中三个常用的关键字,然而它们的作用和用法却有很大的区别。下面我们将详细介绍这三个关键字的区别。 Final Final 是一...

    《剑指offer》Java深入理解final、finally、finalize.pdf

    Java编程中的`final`、`finally`和`finalize`关键字对于理解Java程序的运行机制至关重要。它们各自有独特的用途和特点。 首先,`final`关键字是Java中的一个多面手,它可以用于修饰类、方法和变量。当`final`用于...

    Java面试题-基础+集合原理.pdf

    Java面试题-基础+集合原理 本资源主要涵盖Java面试题的基础知识和集合原理,涵盖Object-Oriented Programming(OOP)相关知识点,包括多态(Polymorphism)、方法Overload和Override、等于运算符(==)和equals()...

    final,finally,finalize .mm

    对于Java中final、finally、finalize的有关问题做下的思维导图,便于深化记忆,希望对你有帮助!注意:文件为.mm后缀建议下载freemind打开,免费的思维导图软件!

    简单谈谈java中final,finally,finalize的区别

    Java中的`final`、`finally`和`finalize`都是关键字,但它们的作用和用途各不相同,对于初学者来说,理解这些概念可能会有些困难。让我们逐一解析它们。 **final** `final`是一个修饰符,主要用于以下几个方面: ...

    第3讲 谈谈final、finally、 finalize有什么不同1

    【Java核心技术】final、finally和finalize是Java编程中三个重要的关键字,它们各自有着独特的功能和用法。 **final关键字** final在Java中扮演着“不可改变”的角色。它可以用来修饰类、方法和变量: 1. **修饰类...

    final、fianlly、finalize区别

    Java 技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去 之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对 象调用的。它是在Object 类中定义的,因此所有的类都...

    java-基础/jvm/多线程

    "Java-基础/jvm/多线程"这个主题涵盖了Java语言的基础知识,包括JVM(Java虚拟机)、多线程以及Java的基础语法和特性。 1. **JVM、JRE和JDK的关系**: - JVM(Java Virtual Machine)是Java程序运行的平台,负责...

    java---面试key

    Java面试中的问题涵盖了许多核心概念和技术,这些都是Java开发者必须掌握的基础知识。以下是对这些知识点的详细解释: 1. **String对象创建**: 当我们创建`String s = new String("xyz");`时,实际上是创建了两个...

    JAVA基础-----面试宝典

    根据给定文件的信息,我们可以提炼出一系列与Java基础及面试相关的知识点,并进行详细的解析: ### 1. Spring、Hibernate、Struts的关系 Spring、Hibernate 和 Struts 是三个非常流行的 Java 框架,它们在 J2EE ...

    java--九阴真经

    1. **final、finally、finalize的区别** - `final`:这是一个修饰符,用于声明不可变的类、变量和方法。当一个类被声明为final,意味着它不能被继承;一个final变量一旦初始化后,就不能再改变其值;final方法不能...

    java面试笔试题---基础

    final, finally, finalize - `final`关键字用于声明不可变的变量、方法或类。 - `finally`块确保在try-catch语句中无论是否发生异常,都会执行的代码。 - `finalize`是Object类的一个方法,用于垃圾回收前的清理...

    java----java面试

    final、finally与finalize - **final**:如上所述,用于声明常量、不可变对象及不可继承类。 - **finally**:确保一段代码无论发生什么异常都会被执行,通常用于资源释放场景。 - **finalize**:对象的析构函数,...

    java九阴真经-面试题及答案

    1. **final, finally, finalize的区别**: - `final`:用于声明类、变量或方法,表示不可变性。当用来修饰类时,禁止子类继承;修饰变量时,变量一旦初始化后不可改变;修饰方法时,防止该方法被子类重写。 - `...

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    在Java面试中,了解final、finally、finalize的区别是非常重要的。final是一个修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。将变量或方法声明为final,可以保证...

Global site tag (gtag.js) - Google Analytics