




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第詳解Java面向?qū)ο缶幊讨鄳B(tài)目錄Java面向?qū)ο缶幊讨鄳B(tài)一.對(duì)于多態(tài)的理解:二.多態(tài)的實(shí)現(xiàn)方法總結(jié)
Java面向?qū)ο缶幊讨鄳B(tài)
一.對(duì)于多態(tài)的理解:
通俗點(diǎn)理解,多態(tài)其實(shí)就是一詞多義,就是一種方法的多種狀態(tài),即不同的類對(duì)象,調(diào)用同一個(gè)方法名,有不同的實(shí)現(xiàn)效果,如下面這段代碼塊:
publicclassTest{
publicstaticvoidmain(String[]args){
Dogdog=newDog("豆豆");
Catcat=newCat("花花");
dog.eat();
cat.eat();
對(duì)象dog和cat看似都調(diào)用了eat方法,都沒(méi)有傳參,按理說(shuō)輸出的結(jié)果應(yīng)該一樣,但其實(shí)不是這樣的,讓我們來(lái)看一下輸出的結(jié)果:
這就是多態(tài)的一種表現(xiàn),所屬不同類的不同對(duì)象調(diào)用同一個(gè)方法名,卻有著不同的實(shí)現(xiàn)效果。
二.多態(tài)的實(shí)現(xiàn)方法
Java中通過(guò)方法重寫(xiě)(也叫方法覆寫(xiě))、方法重載和接口實(shí)現(xiàn)多態(tài)(主要依賴于繼承機(jī)制+方法覆寫(xiě))
1.方法重載
方法重載十分好理解,就是子類和父類的方法名相同,但是參數(shù)個(gè)數(shù)或類型不一樣,返回值不作要求,這里不再贅述
2.方法重寫(xiě)
對(duì)于方法重寫(xiě),通常結(jié)合向上轉(zhuǎn)型和向下轉(zhuǎn)型兩種形式進(jìn)行應(yīng)用,其中向上轉(zhuǎn)型更為常見(jiàn),向下轉(zhuǎn)型相對(duì)使用較少
(1)向上轉(zhuǎn)型:就是子類向父類轉(zhuǎn),向上轉(zhuǎn)型最大的好處就是可以實(shí)現(xiàn)參數(shù)統(tǒng)一化,向上轉(zhuǎn)型可以表現(xiàn)在三個(gè)地方:
其一:產(chǎn)生對(duì)象時(shí):
注意:用這種形式創(chuàng)建的實(shí)例化對(duì)象dog1,其能調(diào)用的方法范圍由父類Animal決定,即只能調(diào)用Animal類中的方法,而不能調(diào)用子類獨(dú)有的方法,只有當(dāng)子類有對(duì)父類的方法重寫(xiě)時(shí),才調(diào)用子類重寫(xiě)后的方法!?。?/p>
其二:方法參數(shù)的傳遞:
其三:方法返回值的傳遞
向上轉(zhuǎn)型的最大好處就是參數(shù)統(tǒng)一化,父類引用可以接收子類所有對(duì)象
看下面這個(gè)例子:
完整代碼為:
publicclassAnimal{
publicStringname;
publicAnimal(Stringa){
name=a;
publicvoideat(){
System.out.println("食物");
publicstaticvoidfun(Animalanimal){
animal.eat();
publicclassDogextendsAnimal{
publicDog(Stringname){
super(name);
publicvoideat(){
System.out.println("骨頭");
publicclassCatextendsAnimal{
publicCat(Stringname){
super(name);
publicvoideat(){
System.out.println("魚(yú)");
publicclassTest{
publicstaticvoidmain(String[]args){
Dogdog=newDog("豆豆");
Catcat=newCat("花花");
dog.fun(dog);
cat.fun(cat);
結(jié)果為:
拆開(kāi)來(lái)分析:
fun方法的參數(shù)為Animal類的實(shí)例化對(duì)象
Animal的子類對(duì)象,可以直接傳入
也就是說(shuō),對(duì)于Animal類的所有子類實(shí)例化對(duì)象,均可以直接向fun方法傳參,避免了重復(fù)性的寫(xiě)諸如publicstaticvoidfun(Dodd){},publicstaticvoidfun(Cata){}等方法
(2)向下轉(zhuǎn)型:向上轉(zhuǎn)型是子類向父類轉(zhuǎn),向下轉(zhuǎn)型則是將轉(zhuǎn)為的父類還原為子類,這里用還原這個(gè)詞是因?yàn)槟芟蛳罗D(zhuǎn)型的前提是:先發(fā)生向上轉(zhuǎn)型且我們需要使用子類獨(dú)有的方法時(shí),才使用向下轉(zhuǎn)型,也很好理解,父類不一定是子類,只有由子類轉(zhuǎn)成的才可以向下轉(zhuǎn)型還原,向下轉(zhuǎn)型的形式如下:
Animalanimal=newDog("豆豆");
Dogdog=(Dog)animal;
基本類似與強(qiáng)制類型轉(zhuǎn)換
注意:向下轉(zhuǎn)型是有風(fēng)險(xiǎn)的,可能無(wú)法強(qiáng)制轉(zhuǎn)換成功,這里可以引用instanceof類,用if語(yǔ)句判斷,避免報(bào)錯(cuò)
if(doginstanceofDog){
(3)方法重寫(xiě)的幾點(diǎn)注意要求:
只能覆寫(xiě)成員方法,不能重寫(xiě)static靜態(tài)方法,但是方法重載是可以重載static方法的子類進(jìn)行方法重寫(xiě),子類方法的權(quán)限修飾符=父類方法的權(quán)限修飾符,同時(shí),子類并不能覆寫(xiě)父類的private方法,對(duì)于父類的包訪問(wèn)權(quán)限修飾方法,在不同包下的子類也不能覆寫(xiě)用final修飾的方法也不能覆寫(xiě)哦(JDK中的String類就是一個(gè)final類)返回值必須相同,或是向上轉(zhuǎn)型的,即覆寫(xiě)的方法的返回值可以是父類方法返回類型的子類注意方法覆寫(xiě)與方法重載的區(qū)別,方法覆寫(xiě):子類與父類的方法名一樣,參數(shù)、返回值類型均一樣,如果只返回值類型不一樣編譯會(huì)報(bào)錯(cuò)可使用@override檢驗(yàn)方法覆寫(xiě)是否一樣
(4)最后是一道例題,容易掉坑:
publicclassA{
publicA(){
this.func();
publicvoidfunc(){
System.out.println("A");
classBextendsA{
privateintnum;
publicB(intnum){
this.num=num;
publicvoidfunc(){
System.out.println("B的num=="+num);
publicstaticvoidmain(String[]args){
Bb=newB(100);
b.func();
分析運(yùn)行后會(huì)輸出什么呢
仔細(xì)想想,小心掉坑,答案在文章末尾給出
3.抽象類
對(duì)于方法的覆寫(xiě),一般的繼承關(guān)系下,子類是可以選擇覆寫(xiě)也可以選擇不覆寫(xiě)的,但在一些場(chǎng)景下,我們想對(duì)子類作出強(qiáng)制性覆寫(xiě)要求,這就引出了抽象類的概念
(1)抽象類用abstract修飾,抽象類是普通類的超集,它只是在普通類的基礎(chǔ)上多了抽象方法,抽象方法是沒(méi)有方法體的,形式如下:
(2)抽象類必須有子類繼承
(3)抽象類無(wú)法實(shí)例化對(duì)象,僅能用子類new相應(yīng)的對(duì)象
(4)普通子類繼承抽象類,必須覆寫(xiě)所有的抽象方法,當(dāng)子類仍為抽象類時(shí),可以選擇不覆寫(xiě),依舊保留抽象方法
(5)abstract修飾符不能和final同時(shí)使用,也不能和private同時(shí)使用
4.接口
上面講的抽象類雖然能實(shí)現(xiàn)方法的覆寫(xiě),但還是有缺陷的,比如抽象類還是遵循單繼承原則,一個(gè)類也只能繼承一個(gè)抽象類,同時(shí),在語(yǔ)義上,只要繼承,就是AisB的意思,有時(shí)候并不符合邏輯,故而又引出了接口這個(gè)概念
(1)接口的定義與使用
我們用關(guān)鍵字interface來(lái)定義接口,子類用關(guān)鍵字implements來(lái)實(shí)現(xiàn)接口,同時(shí),通常,在命名接口時(shí),我們會(huì)用大寫(xiě)的字母I開(kāi)頭命名以示區(qū)別,如下面一段代碼的接口名為IMessage,而對(duì)于實(shí)現(xiàn)接口的子類命名我們通常用Impl作后綴
(2)接口的特點(diǎn):
接口中只有全局常量和抽象方法(JDK8之前,JDK8又?jǐn)U展了default方法,了解即可),如:
publicinterfaceIMessage{
publicstaticfinalinta=10;
publicabstractvoidprint();
接口中只有public權(quán)限,且全部為全局常量和抽象方法,故而,在接口內(nèi),public、static、final、abstract可以省略不寫(xiě),默認(rèn)即為這些關(guān)鍵字,故上一段代碼可以直接寫(xiě)成下面這段:
publicinterfaceIMessage{
inta=10;
voidprint();
接口是沒(méi)有單繼承限制的,子類可以implements多個(gè)父接口,父接口之間用逗號(hào)隔開(kāi),如:
publicclassCImplimplementsIB,IMessage{publicvoidprint(){}publicvoidprintf(){}}
同時(shí),接口之間也可以多繼承,一個(gè)接口可以extends多個(gè)父接口接口同抽象類一樣,是不能直接實(shí)例化對(duì)象的,必須通過(guò)實(shí)現(xiàn)它的子類進(jìn)行實(shí)例化如果一個(gè)子類既有繼承的父類,也有實(shí)現(xiàn)的接口,則先繼承父類再實(shí)現(xiàn)父接口
(3)常用的JDK內(nèi)置的兩大接口
a:Comparable接口
當(dāng)使用Arrays.sort()方法排序時(shí),當(dāng)排序?qū)ο鬄樽远x的類時(shí),sort方法不知道應(yīng)該按照對(duì)象的什么屬性進(jìn)行排序,故而待排序的自定義類需實(shí)現(xiàn)該接口,并將抽象方法compareTo覆寫(xiě),形式如下:
importjava.util.Arrays;
publicclassPersonimplementsComparablePerson{
//兩個(gè)屬性,name和age
privateStringname;
privateintage;
//有參構(gòu)造
publicPerson(Stringname,intage){
=name;
this.age=age;
//定義輸出
publicStringtoString(){
returnname+"的年齡是"+age;
//覆寫(xiě)compareTo方法
publicintcompareTo(Persono){
return(this.age-o.age);
publicstaticvoidmain(String[]args){
Personp1=newPerson("言希",18);
Personp2=newPerson("溫衡",16);
Personp3=newPerson("思莞",17);
Person[]p=newPerson[]{p1,p2,p3};
//用sort方法排序
Arrays.sort(p);
System.out.println(Arrays.toString(p));
輸出結(jié)果(按年齡升序):
b:Cloneable接口
Cloneable接口位于java.lang包中,顧名思義,就是用于克隆,在代碼中也就是復(fù)制新的對(duì)象,新對(duì)象的屬性方法都是從原對(duì)象中拷貝過(guò)來(lái)的,在實(shí)現(xiàn)該接口時(shí),只需要覆寫(xiě)Object類提供的clone方法,如下面示例:
//實(shí)現(xiàn)Cloneable接口
publicclassAnimallimplementsCloneable{
privateStringname;
//clone方法
protectedAnimallclone()throwsCloneNotSupportedException{
return(Animall)super.clone();
publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{
Animalla1=newAnimall();
="豆豆";
//a2由a1克隆而來(lái)
Animalla2=a1.clone();
//輸出a2,和a1一致
System.out.println();
//但是a1并不是a2
System.out.println(a1==a2);
結(jié)果如下:
補(bǔ)充:
Cloneable接口是標(biāo)記接口,即它本身并沒(méi)有任何抽象方法,當(dāng)一個(gè)類實(shí)現(xiàn)了該接口,就表示該類具備了克隆能力clone方法的源代碼為protectednativeobjectclone()throwsCloneNotSupportedException;,其中native也是一個(gè)關(guān)鍵字,表明是本地方法,即調(diào)用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 團(tuán)委組織部工作實(shí)務(wù)培訓(xùn)
- 城市交通規(guī)劃理論重點(diǎn)基礎(chǔ)知識(shí)點(diǎn)
- 《之家汽車(chē)的歷史》課件
- 薪酬管理的合理性分析計(jì)劃
- 學(xué)校藝術(shù)素質(zhì)教育計(jì)劃
- 運(yùn)動(dòng)隊(duì)?wèi)?zhàn)略合同協(xié)議
- 水箱安裝協(xié)議書(shū)
- 青海中考英語(yǔ)試題單選題100道及答案
- 違建拆除協(xié)議書(shū)范本
- 演員離職協(xié)議書(shū)
- 1型糖尿病飲食宣教
- 《精裝修成品保護(hù)》課件
- 學(xué)校食堂設(shè)備故障應(yīng)急預(yù)案
- 《中小學(xué)生時(shí)間規(guī)劃管理主題班會(huì):做時(shí)間的主人》課件(五套)
- 二年級(jí)乘除法口訣專項(xiàng)練習(xí)1000題
- DB35T 2148-2023 養(yǎng)殖大黃魚(yú)等級(jí)規(guī)格
- 藥企與醫(yī)療機(jī)構(gòu)合作協(xié)議書(shū)范文
- 高空作業(yè)安全技術(shù)交底范本模板
- 道路旅客運(yùn)輸企業(yè)雙重預(yù)防機(jī)制建設(shè)指導(dǎo)手冊(cè)
- 數(shù)據(jù)庫(kù)安全技術(shù)賀桂英測(cè)驗(yàn)題答案
- 保育員職業(yè)道德與素養(yǎng)
評(píng)論
0/150
提交評(píng)論