多態(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è)抽象方法,那么子類也是抽象的,再等待子類來繼承并重寫。
