A選項 11 17 34 B選項 22 74 74 C選項 6 7 7 D選項 22 34 17 答案: D選項 解析: 首先,super()函數指的是調用父類的構造方法 ① new B()執行B的構造函數 第一行是super(5); 此時執行的是A的構造函數,A的構造函數調用的是setValue( ...
1 public class Test { 2 public static void main(String [] args){ 3 System.out.println(new B().getValue()); 4 } 5 static class A{ 6 protected int value; 7 public A(int v) { 8 setValue(v); 9 } 10 public void setValue(int value){ 11 this.value = value; 12 } 13 public int getValue(){ 14 try{ 15 value++; 16 return value; 17 } catch(Exception e){ 18 System.out.println(e.toString()); 19 } finally { 20 this.setValue(value); 21 System.out.println(value); 22 } 23 return value; 24 } 25 } 26 static class B extends A{ 27 public B() { 28 super(5); 29 setValue(getValue() - 3); 30 } 31 public void setValue(int value){ 32 super.setValue(2 * value); 33 } 34 } 35 }
A選項 11 17 34
B選項 22 74 74
C選項 6 7 7
D選項 22 34 17
答案: D選項
解析:
首先,super()函數指的是調用父類的構造方法
① new B()執行B的構造函數
第一行是super(5);
此時執行的是A的構造函數,A的構造函數調用的是setValue()方法,由於B重寫了A的這個方法,
所以!!!執行的是B的 setValue()方法。
即傳入的參數是2*5=10
此時,因為super,所以調用的是父類的 setValue()方法,即value=10
第一行執行完畢。
第二行是 setValue(getValue()-3);
B沒有getValue()方法,故執行父類的此方法,
try返回的是value=10+1=11,保存在臨時棧中
finally中調用this的方法,這個this指的是B的對象,又重寫,故就是B的 setValue()方法
value=2*11=22,第一個列印到屏幕上的數字
接下來參數 getValue()-3=11-3=8
傳入B的 setValue()方法
此時value=2*8=16
至此,new B()執行結束
② new B(). getValue()
B沒有 getValue(),故執行A的 getValue()
try返回16+1=17,保存到臨時棧中
finally調用B的 setValue()方法
value=17*2=34,第二個列印到屏幕上面的數字
最後主函數列印返回值,也就是列印try保存到臨時棧中的17