【发布时间】:2024-01-08 04:09:01
【问题描述】:
我对覆盖与隐藏在 Java 中的区别感到困惑。任何人都可以提供有关这些差异的更多详细信息吗?我阅读了Java Tutorial,但示例代码仍然让我感到困惑。
更清楚地说,我很了解覆盖。我的问题是我看不出隐藏有什么不同,除了一个在实例级别而另一个在类级别。
看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中的实例方法
对我来说,直接从Animal 类调用类方法testClassMethod() 会执行Animal 类中的方法这一事实非常明显,没有什么特别之处。然后他们从对myCat 的引用中调用testInstanceMethod(),因此很明显,随后执行的方法是Cat 实例中的方法。
据我所知,调用隐藏的行为就像覆盖一样,那么为什么要区分呢?如果我使用上面的类运行此代码:
Cat.testClassMethod();
我会得到:
Cat 中的类方法
但是,如果我从 Cat 中删除 testClassMethod(),那么我会得到:
Animal 中的类方法。
这告诉我,在子类中编写一个与父类具有相同签名的静态方法几乎可以实现覆盖。
希望我能弄清楚我在哪里感到困惑,并且有人可以解释一下。提前非常感谢!
【问题讨论】:
标签: java inheritance methods overriding method-hiding