public class F {
protected int a=0, b=0;
public F() {
a = 2;
b = 2;
}
public void increase() {
upA();
}
public void upA() {
a = a + 1;
}
public String toString() {
return a+" "+b;
}
}
public class G extends F {
public void increase() {
super.increase();
upB();
}
public void upA() {
a = a + a;
}
public void upB() {
b = b + 1;
}
}
以下Java片段在“输出”窗口中打印了什么?
G g = new G();
g.increase();
System.out.println(g);
有人可以向我解释为什么答案是4,3
(即调用了子类方法,即使我调用了super.increase(),它调用了超类中的upA方法?)
答案 0 :(得分:6)
虚拟调用所有方法,并应用覆盖。所以F
中的代码:
public void increase() {
upA();
}
...正在调用G.upA()
,因为它调用upA()
的对象是G
的实例。
因此increase()
的执行流程为:
G.increase()
来电super.increase()
F.increase()
来电upA()
G.upA()
执行(所以a = 4)G.increase()
来电upB()
G.upB()
执行(所以b = 3)答案 1 :(得分:2)
将increase()视为像这样实现
public void increase() {
this.upA();
}
然后问问自己这个"这个"是
你正在看到"多态"行为,它是对象语言的一个非常强大的功能。
请注意,您可以写
F gInDisguiseAsAnF = new G();
gInDisguiseAsAnF.increase();
仍然得到相同的结果。根据新创建的类型选择了哪个版本的upA()方法。
答案 2 :(得分:1)
public void increase() {
upA();
}
与this.upA()
相同,因此G
中的方法被调用,因为this
是G
的实例。
调用super不会仅以超类型限制当前实例。
答案 3 :(得分:0)
这是从F
的increase()调用的public void upA() {
a = a + a; // a=2+2
}
不
public void upA() {
a = a + 1; //not a=2+1
}