SCJP的考题,求解释

时间:2021-08-20 04:47:54

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();  
  }  
}  



a) 9  
b) 18  
c) 20  
d) 21  
e) 22

答案为什么是22 求解释

8 个解决方案

#1


调用Extension的构造函数时,先调用Base的构造函数。所有的add调用Extension里面的add方法。

可以自己debug看看的额。

#2


new Extension() 会调用 构造函数
Extension() {  
   add(2);  
 } 
构造函数会调用父类构造函数
Base() {  
  add(1);  
 } 
然后会调用add(1),此时是调用子类的函数
void add(int v) {  
    i += v*2;  
 }  
因为初始化时i是0,所以此时i=0+1*2=2
然后父类构造函数结束,回到子类构造函数,继续调用
add(2) 会调用
void add(int v) {  
    i += v*2;  
 } 
因为父类构造函数结束时,i的值为2,所以此时i=2+2*2=6
然后主程序调用
b.add(8);  
这是会调用子类的add方法
void add(int v) {  
    i += v*2;  
 }
所以 i=6+8*2=22

#3


add方法被重写了,初始化子类的时候先去初始化父类,调用的add方法是重写后的,所以
1×2+2×2+8×2

#4


new Extension() ==> 先调用父类的构造函数,再执行自己的构造。
 因为子类中重写了 add 方法,父类中的 add 方法被覆盖。
所以,
Base() {  
  add(1);  


 Extension() {  
   add(2);  
 } 
中调用的add方法,均是
 void add(int v) {  
    i += v*2;  
 }

#5


呵呵,手慢了。 SCJP的考题,求解释

2楼 阿宝 说的比我好。

SCJP的考题,求解释

#6


new Extention的时候
先执行父类Base的构造方法,构造方法中执行了父类的add(1)方法,i执行前为0,执行后为1;
再执行自己构造方法中的其他代码,也就是自己的add(2),i执行前为1,执行后为2*2+1=5;
把这个Extention赋值给Base变量b,执行bogo方法;
b.add方法重载为执行Extention中的add方法i为5+8*2=21;
print方法执行Base中的print方法,打印出i应该为21

#7


看来我错了,父类的构造方法执行了子类中重写的方法

#8


神马都是浮云,唯有DEBUG能给你真相

#1


调用Extension的构造函数时,先调用Base的构造函数。所有的add调用Extension里面的add方法。

可以自己debug看看的额。

#2


new Extension() 会调用 构造函数
Extension() {  
   add(2);  
 } 
构造函数会调用父类构造函数
Base() {  
  add(1);  
 } 
然后会调用add(1),此时是调用子类的函数
void add(int v) {  
    i += v*2;  
 }  
因为初始化时i是0,所以此时i=0+1*2=2
然后父类构造函数结束,回到子类构造函数,继续调用
add(2) 会调用
void add(int v) {  
    i += v*2;  
 } 
因为父类构造函数结束时,i的值为2,所以此时i=2+2*2=6
然后主程序调用
b.add(8);  
这是会调用子类的add方法
void add(int v) {  
    i += v*2;  
 }
所以 i=6+8*2=22

#3


add方法被重写了,初始化子类的时候先去初始化父类,调用的add方法是重写后的,所以
1×2+2×2+8×2

#4


new Extension() ==> 先调用父类的构造函数,再执行自己的构造。
 因为子类中重写了 add 方法,父类中的 add 方法被覆盖。
所以,
Base() {  
  add(1);  


 Extension() {  
   add(2);  
 } 
中调用的add方法,均是
 void add(int v) {  
    i += v*2;  
 }

#5


呵呵,手慢了。 SCJP的考题,求解释

2楼 阿宝 说的比我好。

SCJP的考题,求解释

#6


new Extention的时候
先执行父类Base的构造方法,构造方法中执行了父类的add(1)方法,i执行前为0,执行后为1;
再执行自己构造方法中的其他代码,也就是自己的add(2),i执行前为1,执行后为2*2+1=5;
把这个Extention赋值给Base变量b,执行bogo方法;
b.add方法重载为执行Extention中的add方法i为5+8*2=21;
print方法执行Base中的print方法,打印出i应该为21

#7


看来我错了,父类的构造方法执行了子类中重写的方法

#8


神马都是浮云,唯有DEBUG能给你真相