【问题标题】:Why are private methods in Java implicitly final?为什么 Java 中的私有方法是隐式 final 的?
【发布时间】:2015-01-20 14:56:28
【问题描述】:

我想在“Java in a Nutshell”一书中指出这句话,这让我有些困惑:

私有方法不被子类继承,因此不能被覆盖(即所有私有方法都是隐式最终的)。

我解释说所有私有方法都是最终的,并且我理解:

  • 最终方法不能被覆盖,但可以从子类中调用。
  • 不能重写私有方法,也不能从子类中调用它们。

我的说法正确吗?

【问题讨论】:

  • final 方法不能被覆盖。这就是 final 所做的一切。它们可以或不能被子类调用,具体取决于它们的可见性修饰符(公共、私有、受保护或无)。 docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • 文字是说private方法是final,不是别的。所以,Final 方法不能被覆盖,但可以从子类调用是一种误解。第二个说法是正确的。
  • 你是对的。那时我并没有考虑到知名度。
  • 如果我没记错的话,这本书还谈到了最终方法的优化。我认为他们将final 带入此上下文的原因是表明同样的优化也适用于私有方法。

标签: java overriding private final


【解决方案1】:

final 无法覆盖

private 不能在子类等外部类中使用。

private 方法是隐式最终方法,因此您无法覆盖。

final 方法并不总是私有的,因此如果它不是私有的,您可以在子类中访问。

【讨论】:

    【解决方案2】:

    在我看来,如果您连续考虑这个关键字会有所帮助。

    私人的

    这是访问修饰符,它说明了哪个类可以看到这个方法。 (即只有这个类,子类,包中的其他类)。因此,任何标记为私有的方法都只能在同一个类中看到。因此,您的陈述是正确的,因为从任何子类都看不到标记为私有的方法,更不用说被覆盖或调用了。

    最终

    这表明任何带有此方法的 { } 的东西都不能从外部更改。因此,任何标记为 final 的方法都不能被覆盖。然而,标记为 final 的方法可以根据其访问修饰符从其他类中调用。因此,您关于 final 的说法也是正确的,但调用部分再次严格取决于方法的访问修饰符。

    【讨论】:

      【解决方案3】:

      final 方法不能被覆盖,但可以从子类中调用。

      这可能是也可能不是,这取决于修饰符以及覆盖类的位置。如果方法是私有的或默认的(无修饰符),那么您不能从子类调用该方法,除非您的子类在同一个包中。

      私有方法不能被覆盖,也不能从子类中调用。

      没错。私有方法不能被覆盖的原因是因为它们看不到。然而,这并不意味着不能被覆盖的方法是私有的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-23
        • 2011-03-07
        • 2018-06-27
        • 2010-09-09
        • 2011-07-29
        • 2013-12-01
        • 1970-01-01
        • 2014-08-26
        相关资源
        最近更新 更多