【发布时间】:2019-11-05 23:59:30
【问题描述】:
我试图理解 Java 中的向上转换和向下转换,但我对以下情况感到困惑(关于我的代码,如下所示):
首先-为什么当我包含myAnimal.bark();行时代码无法编译,
第二个-(假设我注释掉myAnimal.bark();)为什么调用myAnimal.move() 打印"moveDog" 而不是"moveAnimal"? myAnimal 不是仅限于来自Animal 类的方法吗,因为我们已将其类型声明为Animal,即使我们将其设置为Dog 的类型?
非常感谢任何帮助!代码如下:
public class Animal {
public void move() {
System.out.println("moveAnimal");
}
public static void main(String[] args) {
Dog myDog = new Dog();
Animal myAnimal = myDog;
myAnimal.move();
//myAnimal.bark();
}
}
class Dog extends Animal {
@Override
public void move() {
System.out.println("moveDog");
}
public void bark() {
System.out.println("bark");
}
}
【问题讨论】:
-
Animal::bark方法不存在所以无法调用。 -
myAnimal 不限于 Animal 类中的方法 - 这就是 OO 的全部意义所在。 子类中具有相同签名(名称,加上其参数的编号和类型)和返回类型的实例方法作为超类中的实例方法会覆盖超类的方法。
-
是的,那为什么要打印moveDog,而不是moveAnimal?
标签: java inheritance downcast upcasting