多態(tài)性(方法的重寫、訪問權(quán)限修飾符、向上、下轉(zhuǎn)型)

多態(tài)性


一、方法的重寫

重載(overload):一個(gè)功能方法的多種寫法。

????? 同一個(gè)類中,方法名必須一致,參數(shù)列表必須不同。

重寫(override):繼承結(jié)構(gòu)。

????概念:在繼承結(jié)構(gòu)中,子類將父類已有的方法,重新實(shí)現(xiàn),這叫方法的重寫。


如果在子類中,存在方法的重寫,那么默認(rèn)調(diào)用的是重寫之后的方法。


方法重寫的規(guī)則:

1、繼承結(jié)構(gòu)中。

2、方法的聲明,必須和父類的一致。

????????方法名必須和父類一致

????????參數(shù)列表必須和父類一致

????????返回值必須和父類一致

3、訪問權(quán)限,不能比父類更加嚴(yán)格。

4、子類重寫的方法,不能拋出比父類更大更多的異常。


* 1.父類的方法,訪問權(quán)限:public

*? 子類重寫,只能public

* 2.父類的方法,訪問權(quán)限:protected

* 子類重寫,protected,public

* 3.父類的方法,訪問權(quán)限:default

* ? 子類重寫,default,protected,public

* 4.父類的方法,訪問權(quán)限:private

* ? 對于子類來講,該方法根本不可見。


二、訪問權(quán)限修飾符

訪問權(quán)限:就是在哪能訪問。通過訪問權(quán)限修飾符來實(shí)現(xiàn)。

作用:限制可見度。

private:私有的。本類中。

默認(rèn)的:(default):注意,啥修飾符都不寫,就是默認(rèn)的。本類。同包下可以訪問。

protected:受保護(hù)的。本類,同包下,不同包(子類使用)

public,沒有限制的。


private---> default--->protected--->public

使用原則:

a、修飾類:只能是public和default

b、修飾成員:變量和方法:以上4個(gè)修飾符都可以。

c、局部變量,不能使用這些修飾符。


三、對象的多態(tài)性

1、什么是多態(tài)

其實(shí)就是事物的多種形態(tài)。

類的實(shí)例:new出來的---->對象。

對象的多態(tài)性:指的是子類對象的多種形態(tài)。

? ? 子類對象? 可以看成子類,也可以看出父類。

父類:Animal

????屬性:name,age

????方法:eat(),sleep()

子類:Cat

????新增屬性:color

????新增方法:catchMouse()

????重寫方法:eat()

子類:Dog

????新增方法:lookDoor()

????重寫方法:eat()

Animal a1 = new Animal();//a1能夠訪問的是父類的屬性和父類的方法

Cat c1 = new Cat();//c1能夠訪問父類屬性:name,age,子類新增color。父類方法:sleep(),子類重寫eat,子類新增catchMouse()

Dog d1 = new Dog();//d1父類屬性:name,age,方法:sleep(),子類重寫eat(),子類新增lookDoor()

結(jié)論:對于子類對象,如果方法存在重寫, 那么一定是調(diào)用重寫之后的方法。

1、如果聲明了一個(gè)父類類型的引用(=左邊),創(chuàng)建的是父類的對象(=右邊)。

可以訪問父類的屬性和方法。(不能訪問子類的)

2、如果聲明了一個(gè)子類類型的引用(=左邊),創(chuàng)建的也是子類的對象(=右邊)。

可以訪問父類的屬性和方法。

還可以訪問子類的新增。

以及子類的重寫。

3、如果聲明了一個(gè)父類類型的引用(=左邊),但是實(shí)際上指向了一個(gè)子類對象。(=右邊)

可以訪問父類的屬性和方法。

以及子類重寫的方法。但是不能訪問子類的新增。



四、向上轉(zhuǎn)型和向下轉(zhuǎn)型

向上轉(zhuǎn)型:一個(gè)子類對象看成了父類類型。那么就失去了子類新增。(自動轉(zhuǎn)換)

Animal a2 = new Cat();

a2,本身是子類對象,但是看成父類類型。

那么能夠訪問父類的屬性,不能訪問子類的新增屬性。

能夠訪問父類的方法,以及子類重寫的方法。

向下轉(zhuǎn)型:

Cat c3 = (Cat)a2;

向上轉(zhuǎn)型后,子類對象看成了父類類型,然后再看成子類類型。(強(qiáng)制轉(zhuǎn)換)

? ? 可以重新訪問子類的新增屬性和方法。

向下轉(zhuǎn)型的注意點(diǎn):不是所有的父類引用都能轉(zhuǎn)成子類類型。向下轉(zhuǎn)型的前提:是一個(gè)子類對象先向上轉(zhuǎn)型了,再轉(zhuǎn)回來,那是可以的。但是如果沒有向上轉(zhuǎn)型,直接父類對象轉(zhuǎn)為子類類型,報(bào)錯(cuò):ClassCastException。

看一個(gè)引用,能夠訪問哪些成員:

看=左邊是什么類型的聲明:

父類類型:那么能夠訪問父類中聲明屬性和方法。

看一個(gè)引用,具體執(zhí)行的方法,是否重寫了:

看=右邊是什么類型的對象:

如果是父類的對象,執(zhí)行沒有重寫的方法,父類的方法。

如果是子類的對象,執(zhí)行的是重寫的方法,子類重寫后的方法。



看戲:國粹,京劇

????京劇大師:---> ? 給大家唱戲:

京劇大師:發(fā)門票,,要來看戲了。。

????病了,無法登臺表演。。。

傳承:子承父業(yè)。兒子也是唱戲的。

兒子畫個(gè)花臉上臺假裝爸爸:裝爹。

只能唱爹的歌。。。重寫的方法。

????下臺卸妝,我是兒子了

????可以唱自己的新歌了。。

五、instanceof

子類對象向上轉(zhuǎn)型,為父類的類型。自動完成。

但是把一個(gè)父類的引用,再轉(zhuǎn)回子類類型。就可能會存在問題。

語法:引用 instanceof 類名 ? ? 例如:c1 instanceof Animal (用于判斷父類是否可以轉(zhuǎn)回子類)

得到的結(jié)果:boolean類型

對于對象的多態(tài)性,如果想向下轉(zhuǎn)型,那么應(yīng)該先加個(gè)邏輯判斷。判斷該引用指向?qū)ο笫欠袷且D(zhuǎn)換的類型。否則的話,會產(chǎn)生錯(cuò)誤:ClassCastException,打斷程序的執(zhí)行。

所以:所有的向下轉(zhuǎn)型之前,都應(yīng)該使用instanceof進(jìn)行判斷。

? ? 向上轉(zhuǎn)型不需要:子類 is a 父類


對象的多態(tài)性的應(yīng)用

如果一個(gè)方法,接收了父類類型作為參數(shù),那么實(shí)際上傳入父類對象和其他的任意子類對象都可以。

如果傳入子類對象的話,會發(fā)生對象的向上轉(zhuǎn)型。

六、多態(tài)性

多態(tài)性:事物的多種形態(tài)。

方法:方法的多種形態(tài),指的就是方法的重載。一個(gè)功能方法,但是根據(jù)參數(shù)不同,執(zhí)行的具體方法也不同。叫做靜態(tài)多態(tài)。程序編譯時(shí)發(fā)生的多態(tài)。

對象:對象的多態(tài)性,也叫動態(tài)多態(tài),結(jié)合方法的重寫。一個(gè)子類對象,如果看成父類的類型,那么執(zhí)行的方法就只能父類的以及子類重寫的。如果再把該對象向下轉(zhuǎn)型轉(zhuǎn)為子類類型,才可以執(zhí)行子類的新增方法。


1、abstract關(guān)鍵字

表示抽象的意思。

1、可以修飾方法:表示該方法是抽象的,該方法沒有方法體。

? ? abstract修飾的方法,表示抽象的方法。沒有方法體。

2、可以修飾類:表示該類是抽象的,該類就不能被實(shí)例化(不能創(chuàng)建對象)。

如果一個(gè)類中,包含了至少一個(gè)抽象方法。那么該類也必須是抽象的。抽象類必須要有子類繼承,并重寫這個(gè)抽象方法。如果子類沒有實(shí)現(xiàn)這個(gè)抽象方法,那么子類也是抽象的,再等待子類來繼承并重寫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容