我对重写与隐藏在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中的class方法。
但是,如果我testClassMethod()
从Cat中删除,则将得到:
Animal中的类方法。
这说明在子类中编写具有与父代相同的签名的静态方法几乎可以重写。
希望我能弄清楚我的困惑之处,并且有人可以阐明。首先十分感谢!