很考java基礎的一道題
阿新 • • 發佈:2018-12-17
Test.main() 函式執行後的輸出是() public class Test { public static void main(String [] args){ System.out.println(new B().getValue()); } static class A{ protected int value; public A(int v) { setValue(v); } public void setValue(int value){ this.value = value; } public int getValue(){ try{ value++; return value; } catch(Exception e){ System.out.println(e.toString()); } finally { this.setValue(value); System.out.println(value); } return value; } } static class B extends A{ public B() { super(5); setValue(getValue() - 3); } public void setValue(int value){ super.setValue(2 * value); } } }
首先,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 1 答案就是:22,34,17