我对覆盖与隐藏在 Java 中的区别感到困惑。任何人都可以提供有关这些差异的更多详细信息吗?我阅读了Java 教程,但示例代码仍然让我感到困惑。
更清楚地说,我理解压倒一切。我的问题是我看不出隐藏有什么不同,除了一个在实例级别而另一个在类级别。
查看Java教程代码:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
然后我们有一个子类Cat
:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
然后他们说:
该程序的输出如下:
Animal 中的类方法。
Cat 中的实例方法。
testClassMethod()
对我来说,直接从Animal
类调用类方法执行类中的方法这一事实Animal
非常明显,没有什么特别之处。然后他们testInstanceMethod()
从对 的引用中调用myCat
,因此很明显,当时执行的方法是 的实例中的方法Cat
。
据我所知,调用隐藏的行为就像覆盖一样,那么为什么要区分呢?如果我使用上面的类运行此代码:
Cat.testClassMethod();
我会得到:
Cat 中的类方法。
但是如果我testClassMethod()
从 Cat 中删除,那么我会得到:
Animal 中的类方法。
这告诉我,在子类中编写一个与父类具有相同签名的静态方法几乎可以实现覆盖。
希望我能弄清楚我在哪里感到困惑,并且有人可以解释一下。首先十分感谢!