public class Test {
public static void main(String[] args){
B b=new B();
A a1=new A();
A a2=b;
a1=b;
a1.printDescription(); //which prints I'm B
a2.printDescription(); //which also prints I'm B
}
}
class A{
public void printDescription(){
System.out.println("I'm A");
}
}
class B extends A{
public void printDescription(){
System.out.println("I'm B");
}
}
搜索后,我找到一个解释Confusion in Java polymorphism,其中说:“即使X为A型明确宣布,它被实例化作为B类的一个对象,所以我将运行版本在B类中定义的doIt()方法。“但是在我使用类A构造函数实例化对象之后,它仍然打印出”我是B“,那么任何人都可以为我解释这一点吗?对象类型混淆
赋值'A1 = B'破阵您自己创建的新A将被覆盖。 – laune
什么是您不清楚的?由于'a1 = b;'和'a2 = b','a1'和'a2'都包含'B'的实例(实际上甚至是相同的实例),并且由于多态性(或者更精确的后期绑定 - 也称为动态绑定)方法'printDescription'的代码在运行时决定,并且基于实例的实际类型(而不是引用)。 – Pshemo