JAVA優秀題目原理及常用注意項目整理

1、java對象實例化過程中的多態特性

執行對象實例化過程中遵循多態特性 ==> 調用的方法都是實例化的子類中的重寫方法,只有明確調用了super.xxx關鍵詞或者是子類中沒有該方法時,纔會去調用父類相同的同名方法。執行對象實例化過程中遵循多態特性 ==> 調用的方法都是實例化的子類中的重寫方法,只有明確調用了super.xxx關鍵詞或者是子類中沒有該方法時,纔會去調用父類相同的同名方法。

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;
            } finally {
                this.setValue(value);
                System.out.println(value);
            }
        }
    }
    static class B extends A {
        public B () {
            super(5);
            setValue(getValue()- 3);
        }
        public void setValue(int value) {
            super.setValue(2 * value);
        }
    }

}

通過上述代碼,始終明確調用的方法必須是實例化子類中重寫的方法

        首先,在main函數中,【new B()】new了一個B類的實例化對象,在實例化對象時,調用了B類中的構造函數,執行【super(5)】,也就是public A(int v)------>setValue(v),由於調用的方法必須是實例化子類中重寫的方法的原則。因此,這裏調用的是B類中的setValue(v)方法,此時B實例的value值設置爲2 x 5 = 10,後執行super.setValue(10),將value=10的值存儲起來。

        執行完super(5)後,執行構造函數中的【setValue(getValue()- 3)】中【getValue()】,由於B類中沒有getValue()方法,則調用父類(A類)中的getValue()方法,value++所得到的值爲11,並存儲在value中(先執行finally中的部分,後執行try中的return),在finally中,調用了【this.setValue(value)】,由於調用的方法必須是實例化子類中重寫的方法的原則,調用的是B類中的setValue(v)方法,此時B實例的value值設置爲2 x 11= 22,之後執行System.out.println(value),即在控制檯上打印22;

        執行完finally中的部分,後執行try中的return,將value++執行後,存儲在value中的11,return回去;執行【setValue(getValue()- 3)】,即:setValue(8)。

        執行setValue(8)時,由於調用的方法必須是實例化子類中重寫的方法的原則,則調用B類中的setValue(v)方法,此時B實例的value值設置爲2 x 8= 16;此時B類中的構造函數執行結束。

        在實例化對象以後,執行【new B().getValue()】,由於B類中沒有getValue()方法,則調用父類(A類)中的getValue()方法,value++所得到的值爲17,並存儲在value中,在finally中,調用了【this.setValue(value)】,由於調用的方法必須是實例化子類中重寫的方法的原則,調用的是B類中的setValue(v)方法,此時B實例的value值設置爲2 x 17= 34,之後執行System.out.println(value),即在控制檯上打印34;

        執行完finally中的部分,後執行try中的return,將value++執行後,存儲在value中的17,return回去;執行【System.out.println(new B().getValue())】,即在控制檯上打印17。

value值的變化過程,僅解釋實例化對象時,構造函數中:super(5)與setValue(getValue()+3)兩部分。圖中兩條線,起點分別爲【new B()】與【setValue(getValue()+3)】:

new B() ->[super(5)(顯示調用父類)->setValue(5)->(調用子類重寫的的setValue(5)->super.setValue(10)-> this.value= 10)
->[setValue(getValue()-3){setValue([getValue()(調用父類的方法) value++(value = 11,return value = 11),執行finally{
this.setValue(11)調用子類的setValue(11)->(super.setValue(22) Sysout.system.out(22))
->[ setValue(11-3)(return 的是11)]setValue(8) ->super.setValue(2 * 8) )->super.setValue(16) this.value = 16;
(new B()).getValue())->value ++->return value ;return value值(value=17 )->finally (this.setValue(17 *2)System.out.print(34))
->System.out.print(new B().getValue));System.out.print(17)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章