java中的多態體現在一個變量可以引用多個不同類對象,但前提是這些不同的類必須有相同的父類。從而該變量可以且只能調用每個不同對象之間的公共操作集(方法)。
在java中,父類變量可以引用子類對象,即Person p = new Chinese();
但是變量p只能調用共同的成員屬性和方法。當子類中已經覆蓋繼承的方法時,父類的變量調用的將是子類中已重寫(Overriding)的方法,重寫Overriding是父類與子類之間多態性的一種表現。
代碼:
public class Dog {
private String getName(){
return "Dog";
}
public String bark(){
return "wang-wang";
}
public void call(){
System.out.println("It's "+getName()+" "+bark());
}
}
public class MiniDog extends Dog{
private String getName(){
return "Mini";
}
public String bark(){
return "woo-woo";
}
}
public class Test {
public static void main(String args[]) {
Dog d = new MiniDog();
d.call();
MiniDog md = new MiniDog();
md.call();
}
}
=======================================================================================
運行結果是:
It's Dog woo-woo
It's Dog woo-woo
解釋:
(1)d調用的是自己的call()方法和getName()方法,因爲bark()被重寫覆蓋所以調用的是子類的。注意:getName()方法沒有被重寫,因爲是父類私有的,對子類來說是不可見的,被隱藏起來。
(2)第二個名字還是Dog是因爲子類沒有實現call()方法,用的是父類的call(),在call()裏調用的還是父類的getName()。