为什么不能在java中覆盖最终类?

时间:2014-02-03 17:26:41

标签: java final override

我被问到为什么不能覆盖最后一堂课的原因。我试图解释它更多的是设计方法,你不希望你的类被扩展或方法被覆盖,最后一个类也有助于使一个对象不可变(虽然有更多的步骤要做而不是只是宣布班级为最终版。)

但是我想知道在将一个类声明为最终类或者它不能被覆盖的事实后是否还有更多的思考过程?

4 个答案:

答案 0 :(得分:1)

因为他们是规则;这是该语言设计的一部分。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.1.2

作为一名设计师,你说“我的班级不适合继承”; Java通过明确阻止某人这样做来尊重这一点。

答案 1 :(得分:0)

final方法无法覆盖,因为这是final的目的:它是一个标语,“不要覆盖它”。

来自Wiki

  

子类不能覆盖或隐藏最终方法。这用于防止子类的意外行为改变可能对类的功能或一致性至关重要的方法。

     

一个常见的误解是,将类或方法声明为final可以通过允许编译器在任何调用它的地方直接插入方法来提高效率(请参阅内联扩展)。但是因为该方法是在运行时加载的,所以编译器无法执行此操作。只有运行时环境和JIT编译器确切知道已加载了哪些类,因此只有他们能够决定何时内联,是否或不是方法是最终的。

答案 2 :(得分:0)

最终类无法扩展,因为Java编译器不允许它,因为Java编译器遵循Java语言规范定义的规则,但不允许它。

答案 3 :(得分:0)

最后一个类是一个无法扩展的类,这就是你无法覆盖最终类的原因

它也用于使类不可变

将class定义为final的一个很好的优点是它可以提高JVM的性能 see this