最近复习Java的基础题,遇到了有趣的题目,看了看帖子,竟然是2007年在论坛上讨论的问题,果真是太阳底下无新鲜事
class Base{
int i;
Base(){
add(1);
System.out.println(i);
}
void add(int v){
i+=v;
System.out.println(i);
}
void print(){
System.out.println(i);
}
}
class MyBase extends Base{
MyBase(){
add(2);
}
void add(int v){
i+=v*2;
System.out.println(i);
}
}
public class TestClu {
public static void main(String[] args) {
go(new MyBase());
//System.out.println();
}
static void go(Base b){
b.add(8);
//b.print();
}
}
下面整理一下思路,所用到的知识点
1.全局变量int默认为0
2.子类的构造过程中,必须 调用其父类的构造方法
3.如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参数的构造方法
围绕这三个知识点,我们可以知道
go(new MyBase());执行go(Base b) 因为确定对象时MyBase()
调用父类时
Base(){
add(1);
System.out.println(i);
}
add用的时MyBase()里的add
因此add(1)就是用了下面的方法
void add(int v){
i+=v*2;
System.out.println(i);
}
i默认为0,i=1*2=2
目前i=2
下面调用MyBase()构造函数
MyBase(){
add(2);
}
add(2)也用了上面的方法
i=2+2*2=6
MyBase()对象里i目前是6
开始执行b.add(8)
i=6 v=8
i=6+2*8=22
因此最终的答案是22