Java: 所有功能都可以覆盖吗?

Java: does all function can be override?

是否可以覆盖所有 Java 方法?

如果不是,什么样的方法不能被覆盖?私有方法?构造方法?

请说明原因。

这里有几点:

1. 标记为 final 的函数不能在子 class.

中被覆盖

2. private 父 class 中的函数不会继承给子 class。所以覆盖不适用于私有方法。

3. 而且构造函数不是函数。此外,构造函数不会继承给子 class。所以你不能覆盖构造函数。但是您可以重载构造函数。

final方法无法在Java中被覆盖。此外,声明为 private 或在 final class 内的方法的行为就好像它们是 final.

为什么?因为这是在 JLS.

中指定的方式

Razib 和 Mick 关于不能被覆盖的函数类型是正确的,但也许您会希望对 为什么 这些不同的函数不能被覆盖进行一些推断。我将依次介绍每种类型。

  1. private方法: 声明为私有的方法旨在对定义它的 class 之外的所有代码隐藏。这促进了封装,或确保其他代码位不依赖于您选择如何实现 class 的能力。如果您希望某个方法可以被继承自您的 classes 访问,请使用修改后的 protected 而不是 private(请参阅 access modifiers 的文档)。
  2. 构造函数: class 的构造函数旨在创建 class 的实例 ,因此不会通过继承 classes 来继承(请参阅此 related question).如果你想做一些比如构造函数覆盖,你可以在继承class中创建一个构造函数,其签名与来自父class的签名相同。

  3. final 方法或来自 final class 的方法: final 关键字可专门用于确保没有实现 class 可以覆盖您的方法,或者没有 class 可以继承您的方法。这可以用于多种目的——包括安全或防止意外后果。看到这个 related question.

  4. static方法: static 关键字可以应用于方法以指示该方法属于 class 本身,而不属于特定实例。由于这些方法属于 class 而不是特定实例,因此您永远不可能拥有继承该方法的对象。因此,覆盖这种方法的概念没有意义。看到这个 related question.