【发布时间】:2020-02-17 19:42:59
【问题描述】:
class X {
protected int v = 0;
public X() {
v += 10;
}
public void proc(X p) {
System.out.println(43);
}
}
class Y extends X {
public Y() {
v += 5;
}
public void proc(X p) {
System.out.println(57);
}
public int getV() {
return v;
}
}
class Z extends Y {
public Z() {
v += 9;
}
public void proc(Z p) {
System.out.println(39);
}
}
class Main {
public static void main(String[] args) {
X x = new Z();
Y y = new Z();
Z z = new Z();
x.proc(z);// 1
System.out.println(y.getV());
}
}
据我所知,方法 proc() 在 X 类型的对象上调用,该对象“持有”类型 Z,并且在运行时 JVM 检查对象的类型并使用来自 Y 的 proc() 方法覆盖该方法。但是方法参数是Z类型的,为什么不调用Z类的重载方法呢?
【问题讨论】:
-
Z 的
proc版本不是 super 的proc的覆盖 - 尝试在proc的Y版本和proc的Z版本和Z版本编译失败。 “错误:方法没有覆盖或实现超类型中的方法”......“子类中的实例方法具有相同的签名(名称,加上其参数的数量和类型)和返回类型作为实例方法超类覆盖超类的方法。”这就是调度在 Y 版本停止的原因。
标签: java inheritance polymorphism overriding overloading