新聞中心
Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
運(yùn)行時(shí)多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)代碼重用的一個(gè)最強(qiáng)大機(jī)制 動(dòng)態(tài)性的概念也可以被說(shuō)成 一個(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)
創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比藍(lán)田網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式藍(lán)田網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋藍(lán)田地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴(lài)。
一 通過(guò)繼承中超類(lèi)對(duì)象引用變量引用子類(lèi)對(duì)象來(lái)實(shí)現(xiàn)
舉例說(shuō)明
//定義超類(lèi)superA
class superA
{
int i =
void fun()
{
System out println( This is superA )
}
}
//定義superA的子類(lèi)subB
class subB extends superA
{
int m =
void fun()
{
System out println( This is subB )
}
}
//定義superA的子類(lèi)subC
class subC extends superA
{
int n =
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() ???????? ( )
a=c
a fun() ???????? ( )
}
}
運(yùn)行結(jié)果為
This is subB
This is subC
上述代碼中subB和subC是超類(lèi)superA的子類(lèi) 我們?cè)陬?lèi)Test中聲明了 個(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) 為什么( )和( )不輸出 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)覆蓋的方法
所以 不要被上例中( )和( )所迷惑 雖然寫(xiě)成a fun() 但是由于( )中的a被b賦值 指向了子類(lèi)subB的一個(gè)實(shí)例 因而( )所調(diào)用的fun()實(shí)際上是子類(lèi)subB的成員方法fun() 它覆蓋了超類(lèi)superA的成員方法fun() 同樣( )調(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í)例化了
二 通過(guò)接口類(lèi)型變量引用實(shí)現(xiàn)接口的類(lèi)的對(duì)象來(lái)實(shí)現(xiàn)
接口的靈活性就在于 規(guī)定一個(gè)類(lèi)必須做什么 而不管你如何做 我們可以定義一個(gè)接口類(lèi)型的引用變量來(lái)引用實(shí)現(xiàn)接口的類(lèi)的實(shí)例 當(dāng)這個(gè)引用調(diào)用方法時(shí) 它會(huì)根據(jù)實(shí)際引用的類(lèi)的實(shí)例來(lái)判斷具體調(diào)用哪個(gè)方法 這和上述的超類(lèi)對(duì)象引用訪(fǎng)問(wèn)子類(lèi)對(duì)象的機(jī)制相似
舉例說(shuō)明
//定義接口InterA
interface InterA
{
void fun()
}
//實(shí)現(xiàn)接口InterA的類(lèi)B
class B implements InterA
{
public void fun()
{
System out println( This is B )
}
}
//實(shí)現(xiàn)接口InterA的類(lèi)C
class C implements InterA
{
public void fun()
{
System out println( This is C )
}
}
class Test
{
public static void main(String[] args)
{
InterA a
a= new B()
a fun()
a = new C()
a fun()
}
}
輸出結(jié)果為
This is B
This is C
上例中類(lèi)B和類(lèi)C是實(shí)現(xiàn)接口InterA的兩個(gè)類(lèi) 分別實(shí)現(xiàn)了接口的方法fun() 通過(guò)將類(lèi)B和類(lèi)C的實(shí)例賦給接口引用a而實(shí)現(xiàn)了方法在運(yùn)行時(shí)的動(dòng)態(tài)綁定 充分利用了 一個(gè)接口 多個(gè)方法 展示了Java的動(dòng)態(tài)多態(tài)性
需要注意的一點(diǎn)是 Java在利用接口變量調(diào)用其實(shí)現(xiàn)類(lèi)的對(duì)象的方法時(shí) 該方法必須已經(jīng)在接口中被聲明 而且在接口的實(shí)現(xiàn)類(lèi)中該實(shí)現(xiàn)方法的類(lèi)型和參數(shù)必須與接口中所定義的精確匹配
lishixinzhi/Article/program/Java/hx/201311/26085
Java程序如何實(shí)現(xiàn)多態(tài)
多態(tài),就是重載和重寫(xiě).重載發(fā)生在一個(gè)類(lèi)中.重寫(xiě)發(fā)生在子類(lèi),意思就是子類(lèi)重寫(xiě)父類(lèi)相同名稱(chēng)的方法.剛學(xué)語(yǔ)言有的東西,不必搞得那么清楚,只有知道怎么用就行了,有的問(wèn)題你要想真正把它搞得很懂,短時(shí)間是不可能的,比如說(shuō)接口,沒(méi)有幾年工作經(jīng)驗(yàn)?zāi)愀静豢赡苷嬲斫馐裁词墙涌?甚至有的人工作四,五年也沒(méi)搞明白什么是接口,不要花太多時(shí)間去搞這些不容易搞懂的問(wèn)題.
重載的特性,方法名相同.返回類(lèi)型,傳入方法的參數(shù)不同(包括個(gè)數(shù)和類(lèi)型).
重寫(xiě)的特性,方法名相同,返回類(lèi)型,參數(shù)均相同,必須發(fā)生在子類(lèi).
1.Java語(yǔ)言允許某個(gè)類(lèi)型的引用變量引用子類(lèi)的實(shí)例,而且可以對(duì)這個(gè)引用變量進(jìn)行類(lèi)型轉(zhuǎn)換。
Animal animal=new Dog(); //引用變量animal引用一個(gè)Animal子類(lèi)Dog的實(shí)例
Dog dog=(Dog)animal; //向下轉(zhuǎn)型,把Animal類(lèi)型轉(zhuǎn)換為Dog類(lèi)型
Creature creature=animal; //向上轉(zhuǎn)型,把Animal類(lèi)型轉(zhuǎn)換為 Creature類(lèi)型
animal=new Cat(); //引用變量animal引用另一個(gè)Animal子類(lèi)Cat的實(shí)例
注:Creature這里指的是生物。
2.如果把引用變量轉(zhuǎn)換為子類(lèi)類(lèi)型,稱(chēng)為向下轉(zhuǎn)型,如果把引用變量轉(zhuǎn)換為父類(lèi)類(lèi)型,稱(chēng)為向上轉(zhuǎn)型。
3.在進(jìn)行引用變量的類(lèi)型轉(zhuǎn)換時(shí),會(huì)受到各種限制。而且在通過(guò)引用變量訪(fǎng)問(wèn)它所引用的實(shí)例的靜態(tài)屬性、靜態(tài)方法、實(shí)例屬性、實(shí)例方法,以及從父類(lèi)中繼承的方法和屬性時(shí),Java虛擬機(jī)會(huì)采用不同的綁定機(jī)制。
4.成員變量、靜態(tài)方法按照引用變量聲明的類(lèi)型靜態(tài)綁定;實(shí)例方法按照引用變量引用的實(shí)例動(dòng)態(tài)綁定。
例如,對(duì)于以下這段代碼:
Fathers f=new Sons();
System.out.println(“f.var=”+f.var);
System.out.println(“f.staticVar=”+f.staticVar);
f.method();
f.staticMethod();
運(yùn)行時(shí)將會(huì)輸出如下結(jié)果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method
class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}
class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";
void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}
String sonVar=null;
void sonMethod(){}
}
誰(shuí)能跟我說(shuō)幾個(gè)JAVA多態(tài),在現(xiàn)實(shí)生活中應(yīng)用的例子,不要說(shuō)代碼和概念,就只說(shuō)案例
有一個(gè)比較經(jīng)典的多態(tài)實(shí)例:
有一個(gè)Animal類(lèi),它有Cat,和Dog兩個(gè)子類(lèi),在Animal中有個(gè)say方法,當(dāng)Cat調(diào)用這個(gè)方法的時(shí)候輸出的是“小貓喵喵喵”,當(dāng)Dog調(diào)用這個(gè)方法時(shí),輸出的是“小狗汪汪汪”,這就是Java多態(tài)的實(shí)現(xiàn)。
1、定義一種動(dòng)物,該類(lèi)型的動(dòng)物有叫的屬性。
2、分別定義貓,狗,鳥(niǎo),都繼承于該動(dòng)物,都有叫的屬性。
3、分別表示出各個(gè)具體小動(dòng)物的叫聲,例如貓的叫聲:喵、狗的叫聲:汪、鳥(niǎo)的叫聲:咻,點(diǎn)是叫聲,實(shí)現(xiàn)各個(gè)具體小動(dòng)物用的叫聲的方法是用的同一個(gè)函數(shù)名稱(chēng),就是動(dòng)物的叫聲函數(shù)。
多態(tài):
這個(gè)案例網(wǎng)上是沒(méi)有的,屬于無(wú)忌獨(dú)創(chuàng),當(dāng)時(shí)在幫孩子輔導(dǎo)作業(yè),小學(xué)科學(xué),里面有一點(diǎn)內(nèi)容是關(guān)于人的牙齒,說(shuō)牙齒分為:門(mén)齒、犬齒、臼齒。
問(wèn)閨女,為什么這么分呢?閨女說(shuō)牙齒雖然都是用來(lái)咬食物,但是食物種類(lèi)很多,咬碎需要的工具也不一樣,門(mén)齒用來(lái)切割食物,如:蘋(píng)果、梨;犬齒用來(lái)撕碎食物。
如肉類(lèi);臼齒用來(lái)磨碎食物,如犬齒撕碎的肉類(lèi),就需要再用臼齒來(lái)磨碎,然后送到食道,胃,小腸,大腸進(jìn)行消化。我恍然大悟,這不就是Java面向?qū)ο罄锏亩鄳B(tài)嗎?多完美啊。
這也很好說(shuō)明了為什么會(huì)有多態(tài)出現(xiàn),因?yàn)樯钪芯痛嬖谔噙@種例子,所以需要多態(tài)來(lái)匹配解決。
本文題目:多態(tài)的實(shí)現(xiàn)java代碼 java 多態(tài)的實(shí)現(xiàn)
地址分享:http://www.dlmjj.cn/article/ddcohsc.html