【发布时间】:2017-10-07 16:21:08
【问题描述】:
package package1;
public class MyClassA {
protected int size;
public MyClassA() {
}
protected int getAge() {
return 10;
}
public int callAge() {
return getAge();
}
}
package package2;
import package1.MyClassA;
public class MyClassB extends MyClassA {
protected int getAge() {
return 20;
}
private int superesult() {
return super.callAge();
}
public static void main(String args[]) {
MyClassB classb = new MyClassB();
System.out.println(classb.getAge());
System.out.println(classb.superesult());
}
}
当我调用 getAge 和 superresult 方法时,我期望 20 10 作为输出,但代码正在打印 20 20。提前致谢。
【问题讨论】:
-
因为
getAge被覆盖了。 -
superresult在MyClassA中调用callAge,callAge调用重写的方法getAge。MyClassB中的覆盖返回 20。这就是覆盖的作用。 -
“我期待 20 10”你为什么期待这样的结果?
-
@Pshemo:我认为 OP 已经考虑到,如果您通过
super调用某些内容,您会“改变上下文”,因为所有调用现在都在“超级域”中。跨度> -
这里要理解的概念叫做多态。从某种意义上说:问“为什么”这样的事情没有多大意义;更像:这就是多态性在 Java 中的表现方式。所以你必须了解这个概念是如何运作的;然后你就会明白你正在观察的行为。