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 关于不能被覆盖的函数类型是正确的,但也许您会希望对 为什么 这些不同的函数不能被覆盖进行一些推断。我将依次介绍每种类型。
private
方法:
声明为私有的方法旨在对定义它的 class 之外的所有代码隐藏。这促进了封装,或确保其他代码位不依赖于您选择如何实现 class 的能力。如果您希望某个方法可以被继承自您的 classes 访问,请使用修改后的 protected
而不是 private
(请参阅 access modifiers 的文档)。
构造函数:
class 的构造函数旨在创建 class 的实例 ,因此不会通过继承 classes 来继承(请参阅此 related question).如果你想做一些比如构造函数覆盖,你可以在继承class中创建一个构造函数,其签名与来自父class的签名相同。
final
方法或来自 final
class 的方法:
final
关键字可专门用于确保没有实现 class 可以覆盖您的方法,或者没有 class 可以继承您的方法。这可以用于多种目的——包括安全或防止意外后果。看到这个 related question.
static
方法:
static
关键字可以应用于方法以指示该方法属于 class 本身,而不属于特定实例。由于这些方法属于 class 而不是特定实例,因此您永远不可能拥有继承该方法的对象。因此,覆盖这种方法的概念没有意义。看到这个 related question.
是否可以覆盖所有 Java 方法?
如果不是,什么样的方法不能被覆盖?私有方法?构造方法?
请说明原因。
这里有几点:
1. 标记为 final
的函数不能在子 class.
2. private
父 class 中的函数不会继承给子 class。所以覆盖不适用于私有方法。
3. 而且构造函数不是函数。此外,构造函数不会继承给子 class。所以你不能覆盖构造函数。但是您可以重载构造函数。
final
方法无法在Java中被覆盖。此外,声明为 private
或在 final class
内的方法的行为就好像它们是 final
.
为什么?因为这是在 JLS.
中指定的方式Razib 和 Mick 关于不能被覆盖的函数类型是正确的,但也许您会希望对 为什么 这些不同的函数不能被覆盖进行一些推断。我将依次介绍每种类型。
private
方法: 声明为私有的方法旨在对定义它的 class 之外的所有代码隐藏。这促进了封装,或确保其他代码位不依赖于您选择如何实现 class 的能力。如果您希望某个方法可以被继承自您的 classes 访问,请使用修改后的protected
而不是private
(请参阅 access modifiers 的文档)。构造函数: class 的构造函数旨在创建 class 的实例 ,因此不会通过继承 classes 来继承(请参阅此 related question).如果你想做一些比如构造函数覆盖,你可以在继承class中创建一个构造函数,其签名与来自父class的签名相同。
final
方法或来自final
class 的方法:final
关键字可专门用于确保没有实现 class 可以覆盖您的方法,或者没有 class 可以继承您的方法。这可以用于多种目的——包括安全或防止意外后果。看到这个 related question.static
方法:static
关键字可以应用于方法以指示该方法属于 class 本身,而不属于特定实例。由于这些方法属于 class 而不是特定实例,因此您永远不可能拥有继承该方法的对象。因此,覆盖这种方法的概念没有意义。看到这个 related question.