(多型)Java向上轉型之後呼叫子類的同名變數/方法的問題
阿新 • • 發佈:2019-01-24
class Father{
public void f(){
System.out.println("A");
}
}
class Son extends Father{
public void f(){
System.out.println("B");
}
public void g(){
System.out.println("B.g");
}
}
public class Text {
public static void main(String[] args) {
Father s = new Son();
s.f();
}
}
Father s = new Son();
表示定義了一個Father型別的引用,指向新建的Son型別的物件。由於Son是繼承自它的父類Father,所以Father型別的引用是可以指向Son型別的物件的。那麼這樣做有什麼意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,
定義一個父類型別的引用指向一個子類的物件既可以使用子類強大的功能,又可以抽取父類的共性。
所以,父類型別的引用可以呼叫父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,它是無可奈何的;
同時,父類中的一個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類型別的引用呼叫;
對於父類中定義的方法,如果子類中重寫了該方法,那麼父類型別的引用將會呼叫子類中的這個方法,這就是動態連線。因此s.f()呼叫子類的方法!
對於多型,可以總結它為:
一、使用父類型別的引用指向子類的物件;
二、該引用只能呼叫父類中定義的方法和變數;
三、如果子類中重寫了父類中的一個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫)
四、變數不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變數,那麼在編譯時會報錯。
另外,還需要注意的是,靜態方法是與類,而並非與單個的物件相關聯的。如果如上的f()方法是static的,那麼呼叫的將是父類的方法,因為static方法是與類繫結的。