我对重写与隐藏在 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();
}
}
然后他们说:
该方案的产出如下:
动物中的类方法。
Cat 中的实例方法。
对我来说,直接从 Animal
类调用类方法 testClassMethod()
来执行 Animal
类中的方法这一事实是显而易见的,没有什么特别之处。然后,他们从对 myCat
的引用中调用 testInstanceMethod()
,所以很明显,执行的方法就是 Cat
实例中的方法。
在我看来,调用隐藏的行为就像覆盖一样,所以为什么要区分它们呢?如果我使用上面的类运行这段代码:
Cat.testClassMethod();
我去拿:
Cat 中的 class 方法。
但是如果我从 Cat 身上移除 testClassMethod()
,我会得到:
Animal 中的 class 方法。
这表明,在子类中编写一个与父类具有相同签名的静态方法几乎可以完成重写。
希望我能解释清楚我的困惑,也希望有人能给我一些启示。非常感谢!