一道筆試題引起的血案之查看程序運行結果

判斷程序輸出的結果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打印出來(22io

接下來setValue(getValue() - 3)內的變量就獲得返回了,那就是11,因而將其減去3獲得8,並做爲參數傳遞,接下來又是調用setValue將8乘以2獲得16進行傳遞,而後按照上面的順序 加1 獲得17 並等待返回class

而後finally塊內,17乘以2獲得34輸出(34變量

最後17被返回,打印(17程序

相關文章
相關標籤/搜索