|
一、通過(guò)繼承中超類(lèi)對(duì)象引用變量引用子類(lèi)對(duì)象來(lái)實(shí)現(xiàn)
舉例說(shuō)明:
//定義超類(lèi)superA
class superA
{
int i = 100;
void fun()
{
System.out.println(“This is superA”);
}
}
//定義superA的子類(lèi)subB
class subB extends superA
{
int m = 1;
void fun()
{
System.out.println(“This is subB”);
}
}
//定義superA的子類(lèi)subC
class subC extends superA
{
int n = 1;
void fun()
{
System.out.println(“This is subC”);
}
}
class Test
{
public static void main(String[] args)
{
superA a;
subB b = new subB();
subC c = new subC();
a=b;
a.fun(); (1)
a=c;
a.fun(); (2)
}
}
運(yùn)行結(jié)果為:
This is subB
This is subC
上述代碼中subB和subC是超類(lèi)superA的子類(lèi),我們?cè)陬?lèi)Test中聲明了3個(gè)引用變量a, b, c,通過(guò)將子類(lèi)對(duì)象引用賦值給超類(lèi)對(duì)象引用變量來(lái)實(shí)現(xiàn)動(dòng)態(tài)方法調(diào)用。也許有人會(huì)問(wèn):“為什么(1)和(2)不輸出:This is superA”。Java 的這種機(jī)制遵循一個(gè)原則:當(dāng)超類(lèi)對(duì)象引用變量引用子類(lèi)對(duì)象時(shí),被引用對(duì)象的類(lèi)型而不是引用變量的類(lèi)型決定了調(diào)用誰(shuí)的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類(lèi)中定義過(guò)的,也就是說(shuō)被子類(lèi)覆蓋的方法。
所以,不要被上例中(1)和(2)所迷惑,雖然寫(xiě)成a.fun(),但是由于(1)中的a被b賦值,指向了子類(lèi)subB的一個(gè)實(shí)例,因而(1)所調(diào)用的fun()實(shí)際上是子類(lèi)subB的成員方法fun(),它覆蓋了超類(lèi)superA的成員方法fun();同樣(2)調(diào)用的是子類(lèi)subC的成員方法fun()。
另外,如果子類(lèi)繼承的超類(lèi)是一個(gè)抽象類(lèi),雖然抽象類(lèi)不能通過(guò)new操作符實(shí)例化,但是可以創(chuàng)建抽象類(lèi)的對(duì)象引用指向子類(lèi)對(duì)象,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性。具體的實(shí)現(xiàn)方法同上例。
不過(guò),抽象類(lèi)的子類(lèi)必須覆蓋實(shí)現(xiàn)超類(lèi)中的所有的抽象方法,否則子類(lèi)必須被abstract修飾符修飾,當(dāng)然也就不能被實(shí)例化了。
jsp技術(shù):運(yùn)行時(shí)實(shí)現(xiàn)Java的多態(tài)性,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。