運(yùn)行時(shí)實(shí)現(xiàn)Java的多態(tài)性
更新時(shí)間:2006年10月13日 00:00:00 作者:
運(yùn)行時(shí)多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)代碼重用的一個(gè)最強(qiáng)大機(jī)制,動(dòng)態(tài)性的概念也可以被說成“一個(gè)接口,多個(gè)方法”。Java實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性的基礎(chǔ)是動(dòng)態(tài)方法調(diào)度,它是一種在運(yùn)行時(shí)而不是在編譯期調(diào)用重載方法的機(jī)制,下面就繼承和接口實(shí)現(xiàn)兩方面談?wù)刯ava運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)。
一、通過繼承中超類對(duì)象引用變量引用子類對(duì)象來實(shí)現(xiàn)
舉例說明:
//定義超類superA
class superA
{
int i = 100;
void fun()
{
System.out.println(“This is superA”);
}
}
//定義superA的子類subB
class subB extends superA
{
int m = 1;
void fun()
{
System.out.println(“This is subB”);
}
}
//定義superA的子類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是超類superA的子類,我們在類Test中聲明了3個(gè)引用變量a, b, c,通過將子類對(duì)象引用賦值給超類對(duì)象引用變量來實(shí)現(xiàn)動(dòng)態(tài)方法調(diào)用。也許有人會(huì)問:“為什么(1)和(2)不輸出:This is superA”。java 的這種機(jī)制遵循一個(gè)原則:當(dāng)超類對(duì)象引用變量引用子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
所以,不要被上例中(1)和(2)所迷惑,雖然寫成a.fun(),但是由于(1)中的a被b賦值,指向了子類subB的一個(gè)實(shí)例,因而(1)所調(diào)用的fun()實(shí)際上是子類subB的成員方法fun(),它覆蓋了超類superA的成員方法fun();同樣(2)調(diào)用的是子類subC的成員方法fun()。
另外,如果子類繼承的超類是一個(gè)抽象類,雖然抽象類不能通過new操作符實(shí)例化,但是可以創(chuàng)建抽象類的對(duì)象引用指向子類對(duì)象,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性。具體的實(shí)現(xiàn)方法同上例。
不過,抽象類的子類必須覆蓋實(shí)現(xiàn)超類中的所有的抽象方法,否則子類必須被abstract修飾符修飾,當(dāng)然也就不能被實(shí)例化了。
一、通過繼承中超類對(duì)象引用變量引用子類對(duì)象來實(shí)現(xiàn)
舉例說明:
//定義超類superA
class superA
{
int i = 100;
void fun()
{
System.out.println(“This is superA”);
}
}
//定義superA的子類subB
class subB extends superA
{
int m = 1;
void fun()
{
System.out.println(“This is subB”);
}
}
//定義superA的子類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是超類superA的子類,我們在類Test中聲明了3個(gè)引用變量a, b, c,通過將子類對(duì)象引用賦值給超類對(duì)象引用變量來實(shí)現(xiàn)動(dòng)態(tài)方法調(diào)用。也許有人會(huì)問:“為什么(1)和(2)不輸出:This is superA”。java 的這種機(jī)制遵循一個(gè)原則:當(dāng)超類對(duì)象引用變量引用子類對(duì)象時(shí),被引用對(duì)象的類型而不是引用變量的類型決定了調(diào)用誰的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
所以,不要被上例中(1)和(2)所迷惑,雖然寫成a.fun(),但是由于(1)中的a被b賦值,指向了子類subB的一個(gè)實(shí)例,因而(1)所調(diào)用的fun()實(shí)際上是子類subB的成員方法fun(),它覆蓋了超類superA的成員方法fun();同樣(2)調(diào)用的是子類subC的成員方法fun()。
另外,如果子類繼承的超類是一個(gè)抽象類,雖然抽象類不能通過new操作符實(shí)例化,但是可以創(chuàng)建抽象類的對(duì)象引用指向子類對(duì)象,以實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性。具體的實(shí)現(xiàn)方法同上例。
不過,抽象類的子類必須覆蓋實(shí)現(xiàn)超類中的所有的抽象方法,否則子類必須被abstract修飾符修飾,當(dāng)然也就不能被實(shí)例化了。
您可能感興趣的文章:
- Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- java 多態(tài)性詳解及常見面試題
- java 多態(tài)性詳解及簡單實(shí)例
- Java靜態(tài)方法不具有多態(tài)性詳解
- 談?wù)剬?duì)Java多態(tài)性的一點(diǎn)理解
- Java中多態(tài)性的實(shí)現(xiàn)方式
- Java多態(tài)性定義與用法實(shí)例詳解
- java對(duì)象類型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)
- 基于Java中對(duì)域和靜態(tài)方法的訪問不具有多態(tài)性(實(shí)例講解)
- Java面向?qū)ο蟪绦蛟O(shè)計(jì)多態(tài)性示例
相關(guān)文章
JSP由淺入深(3)—— 通過表達(dá)式增加動(dòng)態(tài)內(nèi)容
JSP由淺入深(3)—— 通過表達(dá)式增加動(dòng)態(tài)內(nèi)容...2006-10-10AJAX 自學(xué)練習(xí) 請(qǐng)求與顯示
主要功能輸入 城市代碼觸發(fā)發(fā)送請(qǐng)求最終返回城市名稱。2009-09-09jsp實(shí)現(xiàn)簡單用戶7天內(nèi)免登錄
這篇文章主要為大家詳細(xì)介紹了jsp實(shí)現(xiàn)簡單用戶7天內(nèi)免登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02JSP中的PreparedStatement對(duì)象操作數(shù)據(jù)庫的使用教程
這篇文章主要介紹了JSP中的PreparedStatement對(duì)象操作數(shù)據(jù)庫的使用教程,文中舉了一些使用PreparedStatement預(yù)處理語句對(duì)象進(jìn)行MySQL增刪查改的例子,需要的朋友可以參考下2016-04-04JSP 開發(fā)之Spring Boot 動(dòng)態(tài)創(chuàng)建Bean
這篇文章主要介紹了JSP 開發(fā)之Spring Boot 動(dòng)態(tài)創(chuàng)建Bean的相關(guān)資料,需要的朋友可以參考下2017-07-07