Method Hiding in Java

2025年5月10日 | 阅读 4 分钟

在本节中,我们将讨论 Java 中的方法隐藏是什么,方法隐藏因素 (MHF),以及 方法隐藏与 方法重写 之间的区别。还将实现 Java 程序中的方法隐藏概念

要理解 Java 中的方法隐藏概念,首先需要理解方法重写。因为方法隐藏概念与方法重写非常相似。

什么是方法重写?

方法重写是指子类定义了一个实例方法,该方法的签名和返回类型与超类中的实例方法相同。在这种情况下,超类的方法被子类重写(替换)。

静态上下文中的方法

静态方法是使用引用变量的类型而不是对象在编译时绑定的。我们知道静态方法是使用类名而不是对象来访问的。请注意,静态方法可以被重载,但在 Java 中不能被重写。

什么是方法隐藏?

方法隐藏可以定义为“如果子类定义了一个静态方法,其签名与超类中的静态方法相同,在这种情况下,子类中的方法会隐藏超类中的方法。”这个机制称为方法隐藏。这是因为静态方法是在编译时解析的。

方法隐藏因素 (MHF)

  • 方法隐藏因素衡量类中方法的不可见性。
  • 如果一个属性可以被另一个类或对象访问,那么它就被称为可见的。属性应该被隐藏在类中。通过将其声明为 private,可以防止它们被其他对象访问。
  • 理想情况下,方法隐藏因素应该有一个很大的值。
  • 可以使用以下公式计算 MHF
Method Hiding in Java

Java 方法隐藏示例

Sample.java

输出

Method-1 of the Demo class is executed.
Method-1 of the Demo class is executed.
Method-2 of the Demo class is executed.
Method-2 of the Sample class is executed.

我们观察到超类的方法被子类隐藏了。

方法隐藏 vs. 方法重写

隐藏超类的静态方法看起来像重写超类的实例方法。主要区别可以在以下场景的运行时看到。

  • 当我们重写实例方法时,我们可以获得运行时多态性的好处。
  • 当我们重写静态方法时,我们无法获得运行时多态性的好处。
方法隐藏方法重写
两个方法都必须是静态的。两个方法都必须是非静态的。
方法解析由编译器根据引用类型处理。方法解析由 JVM 根据运行时对象处理。
这被认为是编译时多态性、静态多态性或早期绑定。这被认为是运行时多态性、动态多态性或晚期绑定。

让我们通过实践来理解方法隐藏和重写。

上面的代码片段没有执行方法隐藏,因为两个类的方法都是非静态的,因此它们执行方法重写

在上面的代码片段中,为了实现方法隐藏,我们需要将方法设为静态

下表描述了当我们定义一个与超类方法具有相同签名的方法时会发生什么。

定义一个与超类方法具有相同签名的方法
超类实例方法超类静态方法
子类实例方法重写方法生成编译时错误
子类静态方法生成编译时错误隐藏方法

注意:在子类中,我们可以重载从超类继承的方法。重载的方法既不隐藏也不重写超类的实例方法。这些是子类独有的新方法。