面向對象最核心的機制:動態綁定也叫多態
Main方法在內存裏分配內存了這個是執行期間
Cat c = new Cat (“catname”, “blue”);
Lady l1 = new Lady (“l1”,c);
Lady裏有自己的成員變量name,它的名字通過調用構造方法 name = “l1”
還有一個引用類型的成員變量是一個Animal 對象,名字叫Animal:pet
接下來調用構造方法時是把c傳遞給它(把c傳遞給了pet),當new 出這個Lady時pet指向的和c是相同的對象
但是作爲Animal角度想它是把c的對象當成一個普通的Animal對象,當成一隻普通的Animal時,應在指向內部
方法存放在code seg區中一行一行存在
當訪問方法時相當於找到對象,然後看看對象中的方法在哪存着,找到那個方法在執行
當l1調用方法時是根據實際當中的對象來確定
如果通過引用類型來確定那麼調用的是Animal裏的enjoy方法
但是現在是根據實際當中來確定(是整個c的對象) c:xx引用指向cat.enjoy
動態綁定這種機制指的是實際當中new 的什麼類型就調用誰的方法(enjoy方法)
對象內部
實際當中找方法時在對象內部有一個enjoy方法的指針,指向該方法,只不過在new對象時指針隨之改變,new什麼對象就指向那個對象的重寫的方法,這就是動態綁定
爲什麼叫動態呢?
只有在動起來的時候也就是運行期間new出這個對象來才能確定我這個方法調的到底是哪個方法,實際當中的地址纔會綁定到相應的方法之中的地址上面,所以叫動態綁定
動態綁定把程序的擴展性發揮到了極致
Lady的類原來如果要添加新的東西需要修改裏面的方法,使用動態綁定不需要了(直接寫新的類也在main裏new出該類的對象就可以了)
多態的存在有三個必要條件:
- 要有繼承
- 要有重寫
- 父類引用指向子類對象
這三個條件一旦滿足 ,當調用父類裏被重寫的方法時
實際當做new的是那個子類對象就調用子類對象的那個方法