问题描述
- 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(); }
}
解决方案
根据结果写代码,那结果是什么呢?
解决方案二:
sorry,看错了。程序结果是22
http://ideone.com/FLi3ya
在线验证。
解决方案三:
这道题得22,得21的,错在Base里初始化的时候,走了父类的add,其实应该是子类add,因为子类已经重写父类的add方法,所以应该按照子类方法计算,
所以是22
解决方案四:
20,子类中i重新复值为0了
解决方案五:
22,本來我也是21,因為忘記了原來在運行時就可以執行動態綁定方法的調用,因為他是會由外深入到繼承層次結構內部,所以在這裡首先執行的BASE的域i初始化為0,在執行構造器,后因動態綁定調用Extention中的add(int i)方法 i=2;后執行Extention構造器 i = 6,在執行add(8) 后 i= 22;
注意點:動態綁定是在程序運行時進行調用,所以在構造基類時,即使導出類沒有初始化,也會調用導出類的方法.這個例題記得在Thinking in Java多態中有詳細解法..請查看,那上面有非常詳細的解釋
解决方案六:
这是考试现场求答案吗?
放到Eclipse里跑一下结果不就出来了;
解决方案七:
要实例化extention对象,先运行它父类的无参构造函数 变量i为设定初值所以默认为0,父类构造函数运行add函数i变1再运行extention类构造函数,构造函数调用add函数,i变5再运行bogo函数体i变21