多態指不同類的對象對同一指令做出反應,而具體執行那個語句應根據實際情況定;eg
Object o = new GeometricObject();//GeometricObject是Object的子類
System.out.println(o.toString())
o的聲明類型(一個變量必須被聲明爲某種類型,eg int等基本對象的類型;變量的這個類型稱爲他的聲明類型)是object,o的實際類型是GeometricObject(變量的實際類型是被變量引用的對象的實際類)o調用那個toString()方法是由實際類型決定的。若在GeometricObject類中對方法toString()方法進行過重寫,則調用的是實際類型中的toString()方法。
假如o是C1,C2,C3......Cn的實例,C1是C2的子類,C2是C3的子類......如果對象o要調用一個P方法,那程序會依次在C1,C2,C3......Cn類中查找P方法,直到查到P方法。eg:
public class DuoTai {
public static void main(String[] args){
m(new fc());//實際類型是fc,fc中沒有對toString方法進行重寫,所以顯示的是fb類的重寫結果
m(new fb());//相當於Object o = new fb();
m(new fa());//因爲fa是基本變量,所以不用考慮fa子類fb,直接從fa類觀察
m(new Object());
}
public static void m(Object o){
System.out.println(o.toString());
}
}
class fa extends Object{
@Override
public String toString(){
return "1";
}
}
class fb extends fa{
@Override
public String toString(){
return "2";
}
}
class fc extends fb{
}
運行結果爲:
GeometricObject是Object的子類,如果在子類GeometricObject中有A方法,但父類Object沒有A方法,那麼對象o是不能引用A方法的。
而且對象的實際變量是不具備多態性的,o對象實際變量的值都是父類的值,eg:
class BaseClass
{
public String ss = "輸出父類";
}
public class Ploymorphism extends BaseClass
{
public String ss = "輸出子類";
public static void main(String[] args)
{
BaseClass bc = new Ploymorphism();
System.out.println(bc.ss);//結果顯示“輸出父類”
}
}
多態實際是一個多對一的過程,一個對象能選擇不同類(有繼承關係)中的方法輸出。