【问题标题】:Are static functions in a final class implicitly final?最终类中的静态函数是否隐含最终?
【发布时间】:2019-09-12 03:35:25
【问题描述】:

我的问题和this的问题基本一样,但这是否也适用于static函数?

我想了解:

  1. 编译器是否将final 类中的所有static 函数视为final
  2. final 类中将final 关键字添加到static 函数有任何效果吗?

【问题讨论】:

  • 在最终类中声明的任何非最终方法,无论这些方法是否是静态的,都隐含地是最终的,因为永远不会有一个子类可以声明任何潜在的隐藏或覆盖方法。但是,final 类的非 final 方法没有添加 final 修饰符;换句话说,您可以通过反射查询这些方法的修饰符,它们不会是最终的。这与例如接口的行为不同,其中方法声明可以省略 public 修饰符,但这些方法实际上仍然是公共的。
  • @Slaw 感谢您的详细评论。实际上这应该是公认的答案。
  • 这能回答你的问题吗? Behaviour of final static method
  • @LiveandLetLive 感谢您链接问题。但是,我原则上知道finalstatic、方法的覆盖和静态函数的隐藏是什么意思。问题更像是:“在静态函数的情况下,final 关键字还有什么作用,除了防止隐藏它?”。答案似乎是“不”。但是,如果答案是“是”,那么在已经 final 类中创建静态函数 final 实际上会有所不同。

标签: java function class static final


【解决方案1】:

在 final 类中,所有方法也是隐式 final 的,因为将类设为 final 意味着它不能被继承,因此不能在子类中隐藏或覆盖其方法。

因此,实际上你认为 final 类中的静态方法是 final 是正确的,但这并不是因为它是静态方法。这是因为课程是最终的。

【讨论】:

    【解决方案2】:

    所有静态函数都是 final 的,所以 final 类中的函数也是。

    编辑:正如您所指出的,声明一个静态方法 final 将防止子类通过声明一个同名方法来隐藏它。如果一个类是最终的,那么这个属性就无关紧要了,因为不可能存在一个子类来隐藏静态方法。从这个意义上说,是的,所有静态方法都是隐式最终的。

    【讨论】:

    • 静态函数不能被覆盖,但可以隐藏。 final 修饰符防止它被子类静态函数隐藏。这意味着 final 修饰符会有所不同,因此并非所有静态函数都是 final 的。
    • @stonar96 这真的很重要吗?如果一个类是最终类,则永远不会有子类,因此任何方法都不可能被覆盖/隐藏。
    • @Slaw 我同意名称隐藏/覆盖大小写无关紧要。
    • @Slaw 是的,在最终课程的情况下。不是在包含静态方法的非最终类的情况下。因此,使方法成为最终方法的是类上的 final,而不是方法上的 static。
    • @jwenting 我不相信这与我的观点相反。如果一个类是 final 的,那么 任何静态方法都不可能被子类中的方法隐藏,从而使 final 修饰符是否被隐式添加无关紧要。至少在“正常”使用中;正如 StephenC 在链接的问答中提到的那样,反射等事物会产生一些明显的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多