關於多態(動態綁定)見下面具體分析:
首先說明以下知識點:
動態綁定(多態):在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
父類引用指向子類對象,但是父類引用所能看到的只屬於父類那部分屬性和方法。此過程還存在指針指向變化情況(因爲重寫),從指向原來自己方法變化到指向new出來對象的方法。
以簡單程序舉例:
classA{intm;publicintgetM{returnm;}publicvoidsetM(intm){this.m=m;}classBextendsA{intm;publicintgetM{returnm+100;}}publicclassE{publicstaticvoidmain(String[]args){Bb=newB;b.m=20;System.out.println(b.getM);// 120Aa=b;a.m=-100;System.out.println(a.getM);// -100}}
下面針對此題畫內存分析圖分析並附加代碼解釋:
小編是一個有着5年工作經驗的java程序員,對於java,自己有做資料的整合,一個完整學習java的路線,學習資料和工具,相信這裏有很多學習java的小夥伴,我創立了一個2000人學習扣羣,479121291。每晚都有java的直播課程。無論是初級還是進階的小夥伴小編我都歡迎!
b.m = 20; 修改的是B類的屬性,如圖。
b.getM; 是取到B對象自己的方法,輸出20+100
A a = b; 此時a指向B對象,但是所能看到的只是父類那部分屬性和方法。此過程還發生上 面知識點2中的指針指向變化,如圖綠色變變化指向。
a.m = -100; 因爲只能看到父類那部分屬性和方法,所以修改的是A對象的屬性,如圖
a.getM; 因爲此時指向方法的指針發生給變,所以指向的還是B對象的方法(自然用B的屬性),輸出還是20+100