scjp问题请教。

w19995 2002-01-25 02:18:35
What will be written to the standard output when the following program is run?
class Base {
int i;
Base() {
add(1);
}
void add(int v) {
i += v;
}
void print() {
System.out.println(i);
}
}
class Extension extends Base {
Extension() {
add(2);
}
void add(int v) {
i += v*2;
}
}
public class Qd073 {
public static void main(String args[]) {
bogo(new Extension());
}
static void bogo(Base b) {
b.add(8);
b.print();
}
}


我想不出来为什么输出结果是22,请高手看看,帮忙解释解释。
...全文
98 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hushuo 2002-01-25
  • 打赏
  • 举报
回复
java中构造子中的方法同样是动态联编。
也就是始终调用的是Extension类的add

1*2 + 2*2 + 8*2 = 22

c++中构造子中的方法静态联编。觉得还是
c++中合理。
oldcat0076 2002-01-25
  • 打赏
  • 举报
回复
这题并不怪,它考的就是你对java继承的掌握程度,父类的方法被子类方法覆盖,所以父类的构造函数调用的实际上是子类的方法。
ttt 2002-01-25
  • 打赏
  • 举报
回复
同意fltwt(wake),
如果没有super就是调用子类的,这里super的作用当然就是调父类的方法了。
fltwt 2002-01-25
  • 打赏
  • 举报
回复
前面是JAVA的虚拟方法调用。调用子类覆盖的方法。
后面都显式的SUPER了。当然调父类的了。
night_knight 2002-01-25
  • 打赏
  • 举报
回复
class Extension extends Base {
Extension() {
add(2);
}
void add(int v) {
super.add(v);
}
}
这样还是会调用Base.add(int v),你能解释一下吗?ttt(棒棒) 
ttt 2002-01-25
  • 打赏
  • 举报
回复
是的,Base的构造函数调用的是它子类的add方法,因为它被子类覆盖了!
w19995 2002-01-25
  • 打赏
  • 举报
回复
但是在Base中的add()方法并没有被申明成abstract呀。
难道Base的构造函数调用的是它子类的add方法?为什么呢?
ttt 2002-01-25
  • 打赏
  • 举报
回复
我想通了, Base 的 add() 方法被子类覆盖了,所以先调用Extension.add(),然后须序下去,这题真是怪呀
ttt 2002-01-25
  • 打赏
  • 举报
回复
程序改成这样:

class Base {
int i;
Base() {
add(1);
System.out.println("i in base.Base():" + i);
}
void add(int v) {
i += v;
System.out.println("i in base.add():" + i);
}
void print() {
System.out.println(i);
}
}
class Extension extends Base {
Extension() {
add(2);
System.out.println("i in extension.Extension():" + i);
}
void add(int v) {
i += v*2;
System.out.println("i in extension.add():" + i);
}
}
public class Qd073 {
public static void main(String args[]) {
bogo(new Extension());
}
static void bogo(Base b) {
b.add(8);
b.print();
}
}
输出:
i in extension.add():2
i in base.Base():2
i in extension.add():6
i in extension.Extension():6
i in extension.add():22
22
为什么先执行Extension的add()方法,然后再调用构造函数??

还请大侠们指教

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧