在java中覆盖和隐藏有什么区别?

我搜索了很多。 它们之间的区别在于,override是针对实例方法的,而hidden是针对静态方法的。 隐藏实际上是对方法的重新定义。 但是我仍然没有得到它。如果重新定义意味着父类的静态方法仍然存在于子类中,那只是我们看不到它? 或者为什么我们把它称为隐藏而不是任何其他词? 但如果它存在,我找不到再次调用该方法的方法。 说实话,从function层面来说,我无法找到它们与众不同的原因。 有人可以从更深层次的内存中解释它吗?

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

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

当你inheritance非静态成员时,内存中的Sub类对象将包含inheritance的方法以及它自己的方法。 因此,当您尝试在此处编写类似的方法时,将覆盖超类方法。 另一方面,由于静态方法不参与inheritance,所以您编写的任何类似方法都存在于超类中,新方法将在每次要求时运行。 父类方法只是隐藏但没有被覆盖!

从JLS 8.4.8.2开始 ,示例8.4.8.2-1向我们显示隐藏方法绑定到引用的类型( Super ),而overriden方法绑定到Object( 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()); } } 

输出:

 Goodnight, Dick 

超越基本上支持后期绑定。 因此,将在运行时决定调用哪个方法。它用于非静态方法。

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

有关更多详细信息,请参阅覆盖Vs隐藏 ,并查看此链接。

如果调用Superclass.staticMethod()您将获得超类上定义的方法,而不管子类中是否存在任何隐藏。 另一方面,如果你调用((Superclass)subObj).instanceMethod()你仍然会调用该方法,因为它在子类中被重写。