1. 程式人生 > >很考java基礎的一道題

很考java基礎的一道題

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