多態

多態指不同類的對象對同一指令做出反應,而具體執行那個語句應根據實際情況定;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);//結果顯示“輸出父類”

	}
}

多態實際是一個多對一的過程,一個對象能選擇不同類(有繼承關係)中的方法輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章