代码之家  ›  专栏  ›  技术社区  ›  cretzel

在Java中禁止继承的好理由?

  •  151
  • cretzel  · 技术社区  · 17 年前

    11 回复  |  直到 17 年前
        1
  •  196
  •   DJClayworth    8 年前

    这里您最好的参考是Joshua Bloch的优秀著作《高效Java》中的第19项,该书名为“继承的设计和文档,否则禁止继承”。(第二版是第17项,第一版是第15项。)你应该认真阅读,但我会总结一下。

    如果祖先不是为了继承而设计的,那么继承类与其父类之间的交互可能会令人惊讶且不可预测。

    因此,课程应分为两类:

    1. 班级 ,并且有足够的文档来描述应该如何进行

    2. 标记

        2
  •  31
  •   Bill the Lizard    17 年前

    您可能希望将一个方法设为final,以便重写类不能更改其他方法中依赖的行为。构造函数中调用的方法通常声明为final,这样在创建对象时就不会出现任何令人不快的意外情况。

        3
  •  22
  •   John Topley    17 年前

        4
  •  16
  •   Brad Larson    12 年前

    有3个用例可以用于最终方法。

    1. 避免派生类重写特定的基类功能。
    2. 这是出于安全目的,其中基类提供了框架的一些重要核心功能,而派生类不应更改这些功能。

    期末考试的目的:

    所以没有人可以扩展这些类并改变它们的行为。

        5
  •  12
  •   Ray Tayek    17 年前

    您可能希望创建不可变对象( http://en.wikipedia.org/wiki/Immutable_object ),您可能希望创建一个单例( http://en.wikipedia.org/wiki/Singleton_pattern ),或者出于效率、安全或安全考虑,您可能希望阻止某人重写该方法。

        6
  •  7
  •   Jon Skeet    12 年前

    请参阅有效的Java第二版第16条和第17条,或我的博客文章 "Inheritance Tax"

        7
  •  4
  •   Mecki    17 年前

    六羟甲基三聚氰胺六甲醚。。。我可以想到两件事:

    更现实的方法是避免对象变为可变的。例如,由于字符串是不可变的,您的代码可以安全地保留对它的引用

     String blah = someOtherString;
    

    而不是先复制字符串。但是,如果您可以对字符串进行子类化,您可以向其添加允许修改字符串值的方法,现在没有代码可以再依赖于,如果它只是如上所述复制字符串,那么该字符串将保持不变,而必须复制该字符串。

        8
  •  3
  •   Anson Smith    17 年前

    阻止人们做可能使自己和他人混淆的事情。想象一个物理库,其中有一些定义的常数或计算。如果不使用final关键字,就可以有人来重新定义基本计算或永远不会改变的常数。

        9
  •  2
  •   DavidG    17 年前

        10
  •  2
  •   seanalltogether    17 年前

    如果您将类和方法标记为final,您可能会注意到一个小的性能提升,因为运行时不必查找正确的类方法来调用给定的对象。非final方法被标记为virtual,以便在需要时可以适当地扩展它们,final方法可以在类中直接链接或内联编译。

        11
  •  0
  •   Alexander Robinson    10 年前