判斷程序輸出的結果this
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); } } }
答案spa
分析過程:code
實例化B首先實例化Ablog
在實例化B的時候,調用B的構造器,並將5做爲參數傳遞給A的構造器,執行setValue方法,此時B類內已經對繼承來的setValue進行了覆寫,在內部又調用了A的setValue並將 2* 5=10 做爲參數傳遞進去繼承
此時B的成員value值是10,而後執行A的構造器內的setValue(getValue() -3)這一行代碼,首先執行他繼承來的getValue方法get
在getValue中,value的值加1變爲11,此時11要做爲此方法的返回值被返回,接下來執行finally塊內的代碼,再次調用B的setValue方法將value的值設置爲22,並將value打印出來(22)io
接下來setValue(getValue() - 3)內的變量就獲得返回了,那就是11,因而將其減去3獲得8,並做爲參數傳遞,接下來又是調用setValue將8乘以2獲得16進行傳遞,而後按照上面的順序 加1 獲得17 並等待返回class
而後finally塊內,17乘以2獲得34輸出(34)變量
最後17被返回,打印(17)程序