class father
} class son extends father
void show()
}class demo
} father obj = new son(); 編譯看左邊,執行看右邊
1.當出現「父類引用指向子類物件」的情況時,如果子類中重寫了父類中的乙個方法,那麼父類引用在呼叫這個方法的時候,將會呼叫子類中
的這個方法(動態繫結、執行);
2.如果你想實現多型,那麼必須有三個條件:父類引用,子類物件,方法覆蓋;
這裡,如果fathor類有乙個show()方法,那麼形成方法覆蓋,此時才可以這麼寫:obj.show()——此刻形成了多型。
3.在沒有方法覆蓋的情況下,用父類引用去訪問乙個子類的方法,如上面的show()方法——由於父類引用沒有這麼大範圍的許可權,所以會報錯;
4.父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的(對於子類中的成員變
量,它也是無法呼叫的);另外,父類中的乙個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫;
【定義乙個父類型別的引用指向乙個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。】
5.靜態方法是沒有多型性的:靜態方法不會被子類所覆蓋,因此,父類引用只能呼叫父類的靜態方法。
附:一些問題的解答
a:當父類引用f指向其子類的物件的時候,通過f無法訪問專屬於子類物件的成員
q:為什麼這樣不可以?因為f是fatherclass,所以編譯器只知道f擁有fatherclass.class的資訊,fatherclass.class以外的資訊,編譯器
不知道,而子類的物件成員是在sonclass.class裡,也就是說在fatherclass.class以外,所以f無法訪問子類的物件成員。
a:假如子類中有對父類方法的重寫,那麼根據多型機制,通過f訪問這個方法的時候實際訪問的是子類中重寫的方法。
q:為什麼這樣可以?上面說了,f只能訪問fatherclass.class的資訊(注意這裡指的是編譯期編譯器只知道f是fatherclass型別,不知道f
具體指向什麼物件,執行期才知道指向什麼物件),而子類重寫的方法,父類中也存在,即sonclass.class重寫的方法,fatherclass.class裡
也有(如果sonclass.class裡有但是fatherclass.class裡沒有的方法,f也不能直接呼叫),所以f可以訪問,但是呼叫的時候(注意這裡指的
是執行期),f實際指向的是sonclass物件,所以呼叫的是sonclass物件的方法。
a:如果子類重寫的方法中訪問了專屬於子類的成員變數,這時候通過父類引用f還可以呼叫那個被重寫的方法嗎?
q:可以,要分清編譯期和執行期,編譯期是編譯器檢查語法和型別,執行期是解析器解析偽**為機器指令而執行,編譯期編譯器會檢查f
的訪問範圍,也就是f的訪問不超過fatherclass.class的資訊就不會出錯,執行期解析器會解析方法的**指令,因為f指向子類物件,所以會
解析子類重寫的方法**指令,而子類物件的記憶體空間是包含子類的成員變數的空間的,所以也不存在子類成員變數沒有分配記憶體的問題,所
以可以呼叫。
父類引用指向子類物件
要理解多型性,首先要知道什麼是 向上轉型 我定義了乙個子類cat,它繼承了animal類,那麼後者就是前者是父類。我可以通過 cat c new cat 例項化乙個cat的物件,這個不難理解。但當我這樣定義時 animal a new cat 這代表什麼意思呢?很簡單,它表示我定義了乙個animal...
父類引用指向子類物件
是多型的一種實現方式 這樣做使程式靈活性更好,若有多個子類,只需改變引用就能實現不同的功能,而不需要改變程式 父類 a 子類 a1,a2 a obj1 new a1 a obj2 new a2 如果a有乙個方法是show 子類實現了show 那麼obj1.show 就是第乙個子類的show obj2...
父類引用指向子類物件
package fuleiyinyongzhixiang public class animal public void sleep package fuleiyinyongzhixiang public class person extends animal public void play pa...