什么';java中重写和隐藏的区别是什么?

什么';java中重写和隐藏的区别是什么?,java,Java,我找了很多。它们之间的区别在于覆盖是针对实例方法的,而隐藏是针对静态方法的。而隐藏的事实是对方法的重新定义。但是我还是不明白。如果重新定义意味着父类的静态方法仍然存在于子类中,那就是我们看不到它?或者为什么我们称之为隐藏,而不是其他任何词?但是如果它存在,我就找不到再次调用该方法的方法。老实说,从功能层面上讲,我无法找到它们不同的原因。有人能从更深的层次(如内存)来解释它吗?来自示例8.4.8.2-1,它向我们展示了一个隐藏的方法绑定到引用的类型(Super),而重写的方法绑定到对象的类型(Su

我找了很多。它们之间的区别在于覆盖是针对实例方法的,而隐藏是针对静态方法的。而隐藏的事实是对方法的重新定义。但是我还是不明白。如果重新定义意味着父类的静态方法仍然存在于子类中,那就是我们看不到它?或者为什么我们称之为隐藏,而不是其他任何词?但是如果它存在,我就找不到再次调用该方法的方法。老实说,从功能层面上讲,我无法找到它们不同的原因。有人能从更深的层次(如内存)来解释它吗?

来自示例8.4.8.2-1,它向我们展示了一个隐藏的方法绑定到引用的类型(
Super
),而重写的方法绑定到对象的类型(
Sub

输出:

Goodnight, Dick

如果调用
Superclass.staticMethod()
,不管子类中发生了什么隐藏,都将得到在超类上定义的方法。另一方面,如果调用
((超类)subObj).instanceMethod()
,您仍将调用该方法,因为它在子类中被重写。

静态成员(方法和变量)将不存在于继承它们的子类(子类)对象中,但它们将作为单个副本存在于内存中

静态成员可以通过超类和子类的类名来访问,但它们并不实际存在于这些类的对象中


当您继承非静态成员时,内存中的子类对象将同时包含继承的方法及其自身的方法。所以,当您尝试在这里编写类似的方法时,超类方法将被重写。另一方面,由于静态方法不参与继承,所以您编写的任何类似方法都存在于超类中,每次请求新方法时,新方法都会运行。父类方法只是隐藏,但没有被覆盖

Over-riding基本上支持后期绑定。因此,将调用哪个方法是在运行时决定的。它适用于非静态方法

隐藏适用于所有其他成员(静态方法、实例成员、静态成员)。它基于早期绑定。更清楚的是,要调用或使用的方法或成员是在编译时决定的


有关更多详细信息,请参阅并参阅链接。

您可以调用隐藏方法:您可能希望使用
SuperType
(或类似的方法)而不是
Super
,以防止读者对
Super
关键字感到困惑…如果我不在Sub中隐藏问候语()。如果隐式问候语()Sub中的方法仍然绑定到引用的类型(Super)?@deathlee,如果您不在
Sub
中隐藏
greeting()
方法,则调用哪个方法不会有歧义。它将调用
Super
版本。
Goodnight, Dick