我搜索了很多。它们之间的区别在于,override是针对实例方法的,而hidden是针对静态方法的。隐藏实际上是对方法的重新定义。但是我仍然没有得到它。如果重新定义意味着父类的静态方法仍然存在于子类中,那只是我们看不到它?或者为什么我们把它称为隐藏而不是任何其他词?但如果它存在,我找不到再次调用该方法的方法。说实话,从功能层面来说,我找不到它们为什么不同。有人可以从更深层次的内存中解释它吗?
答案 0 :(得分:2)
从JLS 8.4.8.2开始,示例8.4.8.2-1向我们显示隐藏方法绑定到引用类型(Super
),而overriden方法绑定到Object类型({{ 1}})。
Sub
输出:
class Super {
static String greeting() { return "Goodnight"; }
String name() { return "Richard"; }
}
class Sub extends Super {
static String greeting() { return "Hello"; }
String name() { return "Dick"; }
}
class Test {
public static void main(String[] args) {
Super s = new Sub();
System.out.println(s.greeting() + ", " + s.name());
}
}
答案 1 :(得分:2)
覆盖基本上支持后期绑定。因此,将在运行时决定调用哪个方法。它用于非静态方法。
隐藏适用于所有其他成员(静态方法,实例成员,静态成员)。它基于早期绑定。更清楚的是,在编译期间决定要调用或使用的方法或成员。
有关详细信息,请参阅Overriding Vs Hiding,另请参阅this链接。
答案 2 :(得分:1)
静态成员(方法和变量)不会出现在继承它们的子类(子类)对象中,但它们将作为单个副本存在于内存中。
静态成员可以通过超类和子类的类名访问,但它们实际上不存在于这些类的对象中。
当您继承非静态成员时,内存中的Sub类对象将包含继承的方法以及它自己的方法。因此,当您尝试在此处编写类似的方法时,将覆盖超类方法。另一方面,由于静态方法不参与继承,所以您编写的任何类似方法都存在于超类中,新方法将在每次要求时运行。父类方法只是隐藏但没有被覆盖!
答案 3 :(得分:0)
如果你调用Superclass.staticMethod()
,你将获得超类中定义的方法,无论是否在子类中发生任何隐藏。另一方面,如果你调用((Superclass)subObj).instanceMethod()
,你仍然会调用该方法,因为它在子类中被覆盖。