先來看一段代碼:
class BaseClass{
public int book = 6;
public void base(){
System.out.println("父類的普通方法");
}
public void test(){
System.out.println("父類被覆蓋的方法");
}
}
public class SubClass extends BaseClass{
// 重新定義一個book實例成員變量隱藏父類的book實例成員變量
public String book = "輕量級Java EE企業應用實戰";
public void test(){
System.out.println("子類的覆蓋父類的方法");
}
public void sub(){
System.out.println("子類的普通方法");
}
public static void main(String[] args) {
// 下面編譯時類型和運行時類型完全一樣,因此不存在多態
BaseClass bc = new BaseClass();
// 輸出6
System.out.println(bc.book);
// 下面兩次調用將執行BaseClass的方法
bc.base();
bc.test();
// 下面編譯時類型和運行時類型完全一樣,因此不存在多態
SubClass sc = new SubClass();
// 輸出"輕量級Java EE企業應用實戰"
System.out.println(sc.book);
// 下面調用將執行從父類繼承到的base方法
sc.base();
// 下面調用將執行當前類的test方法
sc.test();
// 下面編譯時類型和運行時類型不一樣,多態發生
BaseClass ploymophicBc = new SubClass();
// 輸出6 ----- 表明訪問的是父類的成員變量
System.out.println(ploymophicBc.book);
// 下面調用將執行父類繼承到的base方法
ploymophicBc.base();
// 下面調用將執行當前類的test方法
ploymophicBc.test();
}
}
public int book = 6;
public void base(){
System.out.println("父類的普通方法");
}
public void test(){
System.out.println("父類被覆蓋的方法");
}
}
public class SubClass extends BaseClass{
// 重新定義一個book實例成員變量隱藏父類的book實例成員變量
public String book = "輕量級Java EE企業應用實戰";
public void test(){
System.out.println("子類的覆蓋父類的方法");
}
public void sub(){
System.out.println("子類的普通方法");
}
public static void main(String[] args) {
// 下面編譯時類型和運行時類型完全一樣,因此不存在多態
BaseClass bc = new BaseClass();
// 輸出6
System.out.println(bc.book);
// 下面兩次調用將執行BaseClass的方法
bc.base();
bc.test();
// 下面編譯時類型和運行時類型完全一樣,因此不存在多態
SubClass sc = new SubClass();
// 輸出"輕量級Java EE企業應用實戰"
System.out.println(sc.book);
// 下面調用將執行從父類繼承到的base方法
sc.base();
// 下面調用將執行當前類的test方法
sc.test();
// 下面編譯時類型和運行時類型不一樣,多態發生
BaseClass ploymophicBc = new SubClass();
// 輸出6 ----- 表明訪問的是父類的成員變量
System.out.println(ploymophicBc.book);
// 下面調用將執行父類繼承到的base方法
ploymophicBc.base();
// 下面調用將執行當前類的test方法
ploymophicBc.test();
}
}
說明:
當把一個子類對象直接賦給父類的引用變量是,例如上面的BaseClass ploymophicBc = new SubClass();,這個ploymophicBC應用變量的編譯時類型是BaseClass,而運行時類型是SubClass,當運行時調用該引用變量的方法,其行為總是表現出子類方法的行為特征,而不是父類方法的行為特征,這就可能出現:相同類型的變量,調用同一個方法時呈現出多種不同的行為特征,這就是多態。
