天天看點

Java中對象執行個體化過程中的多态特性

Java中對象執行個體化過程中的多态特性

通過上述代碼,始終明确調用的方法必須是執行個體化子類中重寫的方法。

        首先,在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)】:

Java中對象執行個體化過程中的多态特性

執行結果為: 

Java中對象執行個體化過程中的多态特性