java笔试题,根据代码写结果

public class Base
{
int i;
Base()
{
add(1);
}
void add(int v)
{
i+=v;
}

void print()
{
    System.out.println(i);
}

}
public class Extention extends Base
{
Extention()
{
add(2);
}
void add(int v)
{
i+=v*2;
}
}

public class Qd01
{
public static void main(String[] args)
{
bogo(new Extention());
}

static void bogo(Base b)
{
    b.add(8);
    b.print();
}

}

根据结果写代码,那结果是什么呢?

要实例化extention对象,先运行它父类的无参构造函数 变量i为设定初值所以默认为0,父类构造函数运行add函数i变1再运行extention类构造函数,构造函数调用add函数,i变5再运行bogo函数体i变21

sorry,看错了。程序结果是22

http://ideone.com/FLi3ya
在线验证。

20,子类中i重新复值为0了

这道题得22,得21的,错在Base里初始化的时候,走了父类的add,其实应该是子类add,因为子类已经重写父类的add方法,所以应该按照子类方法计算,
所以是22

22,本來我也是21,因為忘記了原來在運行時就可以執行動態綁定方法的調用,因為他是會由外深入到繼承層次結構內部,所以在這裡首先執行的BASE的域i初始化為0,在執行構造器,后因動態綁定調用Extention中的add(int i)方法 i=2;后執行Extention構造器 i = 6,在執行add(8) 后 i= 22;
注意點:動態綁定是在程序運行時進行調用,所以在構造基類時,即使導出類沒有初始化,也會調用導出類的方法.這個例題記得在Thinking in Java多態中有詳細解法..請查看,那上面有非常詳細的解釋

这是考试现场求答案吗?
放到Eclipse里跑一下结果不就出来了;