public class XXX {
@Test
public void test() {
B b = new B();
b.doY();
}
}
class A {
public void doY() {
XProcedure.doX(this);
}
}
class B extends A {
public void doY() {
super.doY();
XProcedure.doX(this);
}
}
class XProcedure {
public static void doX(A a) {
System.out.println("AAAA!");
}
public static void doX(B b) {
System.out.println("BBBB!");
}
}
输出
AAAA! BBBB!
我想知道为什么?
答案 0 :(得分:3)
虽然XProcedure有两个同名的方法 - doX,但这两个签名是不同的。第一种方法获取类A的实例作为参数,第二种方法获取类B的实例。
当您调用XProcedure.doX(this)
时,将根据传递的参数的类调用正确的方法。
“AAAA”!由于super.doY()
电话打印
“BBBB!”由于XProcedure.doX(this);
电话而打印。
this
在A的构造函数中与B的构造函数中的this
不同。虽然A的构造函数是从B的构造函数中调用的,但在A的范围内,该实例属于A类。
答案 1 :(得分:1)
你打电话给super.doY
这是B超级A的方法。
所有动物都可以说话。
猫是一种动物。
一只猫说话并喝牛奶。