【问题标题】:Final methods in HashMap ClassHashMap 类中的最终方法
【发布时间】:2019-03-19 18:18:10
【问题描述】:

我刚刚浏览了openJDK8中HashMap的源代码,想了解虽然TreeMap(static final class TreeNode)类被声明为final,但类中有些方法被声明为final - 想了解的意义。

由于类被标记为final,类不能被扩展,所以它的方法不能被覆盖,我已经阅读了oracle docs,它说有时从构造函数调用的方法需要声明为final ,但是有些方法不是从构造函数调用的,它们仍然被声明为 final。所以谁能帮我理解一下。

下面的链接有完整的代码:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/HashMap.java

【问题讨论】:

  • HashMap 已扩展,因此它不是最终类,但有些方法是最终类,因此可以假定它们的行为。
  • 我的问题是,当一个类是final的时候(比如HashMap中的TreeNode类),它的所有方法都变成final的,那么让它的方法再次成为final有什么意义呢。
  • 我认为原因纯粹是风格上的,只是为了让代码读者一目了然。

标签: java hashmap final


【解决方案1】:

方法声明中使用的final关键字与类声明中使用的final关键字的用途不同。

final 方法:-您可以将类的部分或全部方法声明为 final。您在方法声明中使用 final 关键字来指示该方法不能被子类覆盖。 Object 类就是这样做的——它的一些方法是最终的。

final class :- 你也可以声明整个类 final。声明为 final 的类不能被子类化。这特别有用,例如,在创建像 String 类这样的不可变类时。

来源:-https://docs.oracle.com/javase/tutorial/java/IandI/final.html

【讨论】:

  • 我的问题是,当一个类是final的时候(比如HashMap中的TreeNode类),它的所有方法都变成final的,那么让它的方法再次成为final有什么意义呢。
  • 好的,一旦类是final的,那个类就不能扩展了,那为什么我们把类里面的一些方法声明为final呢,我已经浏览了你给出的链接,一些方法不是从构造函数调用的,它们仍然被声明为 final。
  • 谢谢,一旦这个类被标记为final,这个类就不能被扩展,所以它的方法不能被覆盖,我已经浏览了你提供的链接,有时会说方法从构造函数调用的方法需要声明为final,但是有些方法不是从构造函数调用的,它们仍然被声明为final。所以我想了解这一点
  • @Vignesh 在网上搜索后,我仍然无法弄清楚为什么 HashMap 中的某些方法明确声明为 final。但是java也不限制这样做,就像你可以在接口方法中显式声明public abstract,尽管它们是隐含的public abstract。
  • 谢谢,我也看不懂,所以想确认一下有没有什么原因。
【解决方案2】:

“final”关键字用于方法声明中,表示该方法不能被子类覆盖。

除此之外,它还有一些性能优势:

"final 方法可以在加载到 JVM 后内联,因为此时 JVM 肯定知道该方法是 final。因此在类加载后运行的编译器,例如 JIT 编译器,可以利用 final 方法。因此,声明为 final 的方法可能会带来一些性能优势。”

尽管它具有性能优势,但最重要的使用目标是“清晰的设计”。它在 HashMap 中用于指示这些方法不会被子类覆盖,因为它们的实现以这种方式得到保证

【讨论】:

  • 我的问题是,当一个类是final的时候(比如HashMap中的TreeNode类),它的所有方法都变成final的,那么让它的方法再次成为final有什么意义呢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多