我有这两个类,我想知道输出为A
,B
和B.xxx
的原因。有人可以解释为什么它不是A.xxx
当它被铸造?
这是我的两个班级和主要方法:
public abstract class A {
public A() {
System.out.println("A");
}
public void xxx() {
System.out.println("A.xxx");
}
abstract void yyy();
}
public class B extends A {
public B() {
System.out.println("B");
}
public void xxx() {
System.out.println("B.xxx");
}
public void yyy() {
System.out.println("B.yyy");
}
}
public class ClassRunner {
public static void main(String[] args) {
B b2 = new B();
((A)b2) .xxx();
}
}
答案 0 :(得分:0)
所以当你有继承......表单的变量初始化
A my_A = new B()
其中B延伸A ...称为伪装。您将B的实例伪装成A的对象。经验法则是等号左侧的类(A)定义了允许在对象上调用的方法。由于A类具有“.xxx()”方法,因此我们可以使用它。另一方面,等号右侧的类定义了我们使用的.xxx()方法的实际版本。由于B类在右侧,我们使用B的.xxx()版本。如果B没有.xxx(),则默认使用A的版本。