<small>
1、多態(tài)
1)、兩種表現(xiàn)形式:
a、一個(gè)對(duì)象,多種形態(tài)。
同一個(gè)對(duì)象,在不同場(chǎng)合下,
表現(xiàn)出不同的形態(tài),能完成不同的功能。
在java中,往往使用implements關(guān)鍵字,實(shí)現(xiàn)多個(gè)接口。
//同一個(gè)人
CC peo = new CC();
//同一個(gè)人,在不同的場(chǎng)合,表現(xiàn)出不同的形態(tài)
//不同角色,表現(xiàn)的行為也不一樣。
Teacher teacher = peo;
teacher.teach();//老師可以講課
Father father = peo;
father.talkToSon();//父親教育孩子
Husband husband = peo;
husband.giveMySalary();//丈夫上交工資
b、多個(gè)對(duì)象,同一形態(tài)。
不同對(duì)象,向上造型成同一種類(lèi)型。
實(shí)現(xiàn)相同的功能。
在java中,往往使用extends關(guān)鍵字,繼承同一個(gè)父類(lèi)。
Tiger tiger = new Tiger();
tiger.name = "小王";
Snake snake = new Snake();
snake.name = "莽山烙鐵頭";
Lion lion = new Lion();
lion.name = "東北獅王";
//不同對(duì)象,表現(xiàn)出同一種形態(tài)。
Animal animal1 = tiger;
Animal animal2 = snake;
Animal animal3 = lion;
2、引用類(lèi)型強(qiáng)制類(lèi)型轉(zhuǎn)換
回顧:基本類(lèi)型強(qiáng)制類(lèi)型轉(zhuǎn)換
long l = 1000;
int i = (int)l;
byte b = (byte)i;//溢出
Animal animal = new Tiger();
animal.name = "小王";
//引用類(lèi)型強(qiáng)制類(lèi)型轉(zhuǎn)換
Lion lion = (Lion)animal;//錯(cuò)誤,會(huì)導(dǎo)致類(lèi)型轉(zhuǎn)換異常ClassCastException
instanceof關(guān)鍵字:
可用于在引用類(lèi)型轉(zhuǎn)換之前,實(shí)現(xiàn)類(lèi)型判斷。
符合轉(zhuǎn)換匹配的類(lèi)型,方能實(shí)現(xiàn)強(qiáng)制類(lèi)型轉(zhuǎn)換。
有效的避免了引用類(lèi)型轉(zhuǎn)換異常的發(fā)生。
語(yǔ)法:
大類(lèi)型 大類(lèi)型引用 = new 小類(lèi)型();
if(大類(lèi)型引用 instanceof 小類(lèi)型){//類(lèi)型判斷
//類(lèi)型匹配
小類(lèi)型 小類(lèi)型引用 = (小類(lèi)型)大類(lèi)型引用;
}
//引用類(lèi)型強(qiáng)制類(lèi)型轉(zhuǎn)換
Lion lion = (Lion)animal;//錯(cuò)誤
改造成
if(animal instanceof Lion){
//只有匹配才能進(jìn)來(lái)
Lion lion = (Lion)animal;
}
3、方法重寫(xiě)要求:
a、發(fā)生在子父類(lèi)之間
b、方法名相同、參數(shù)列表相同
c、訪問(wèn)權(quán)限不能變小
d、拋出異常不能變大
e、返回值類(lèi)型可以是本類(lèi)或其子類(lèi)
********************** pm ************************
1、內(nèi)部類(lèi)
class:類(lèi)
class:實(shí)體類(lèi)
abstract class:抽象類(lèi)
1)、內(nèi)部類(lèi)
定義在類(lèi)內(nèi)部的類(lèi),稱(chēng)為內(nèi)部類(lèi)。
類(lèi)內(nèi)部:
類(lèi)體、方法體。
2)、內(nèi)部類(lèi)定義
外部類(lèi):定義了內(nèi)部類(lèi)的類(lèi)。
內(nèi)部類(lèi):定義在外部類(lèi)中的類(lèi)。
class Outer{//外部類(lèi)
class Inner{//內(nèi)部類(lèi)
}
}
只要是類(lèi),類(lèi)中可定義:成員變量、方法、靜態(tài)塊。
3)、內(nèi)部類(lèi)的使用
a:創(chuàng)建內(nèi)部類(lèi)對(duì)象
step1:先創(chuàng)建外部類(lèi)對(duì)象。
step2:再通過(guò)外部類(lèi)創(chuàng)建內(nèi)部類(lèi)對(duì)象。
b、在外部類(lèi)外面
對(duì)內(nèi)部類(lèi)屬性使用、方法調(diào)用
與普通類(lèi)的屬性使用、方法調(diào)用一致。
通過(guò)引用.屬性,引用.方法
c、內(nèi)部類(lèi)中(**注意)
調(diào)用內(nèi)部類(lèi)屬性:this.屬性;
調(diào)用外部類(lèi)屬性:外部類(lèi)名.this.屬性;
4)、內(nèi)部類(lèi)意義
封裝在內(nèi)部類(lèi)的中代碼,不可以直接訪問(wèn),必須先創(chuàng)建
外部類(lèi)對(duì)象,通過(guò)外部類(lèi)對(duì)象創(chuàng)建內(nèi)部類(lèi)對(duì)象,才能訪問(wèn)。
一定程度上,起到了代碼保護(hù)效果。
PS:普通內(nèi)部類(lèi)很少使用。
2、匿名內(nèi)部類(lèi)
1)、匿名內(nèi)部類(lèi)
class Outer{//外部類(lèi)
class {//匿名內(nèi)部類(lèi)??????
}
}
上述定義是錯(cuò)誤的。
2)、匿名內(nèi)部類(lèi)定義
某個(gè)類(lèi)的匿名內(nèi)部類(lèi),并非直接在類(lèi)中定義。
在外部類(lèi)對(duì)象創(chuàng)建的時(shí)候定義。
step1:先創(chuàng)建外部類(lèi)對(duì)象
OuterClass outer = new OuterClass();
step2:在外部類(lèi)創(chuàng)建對(duì)象的()與;中間,
添加一對(duì){},則{}即為匿名內(nèi)部類(lèi)類(lèi)體。
step3:匿名內(nèi)部類(lèi)中可以定義屬性、方法。
3)、匿名內(nèi)部的使用。
匿名內(nèi)部類(lèi)屬性,只能在匿名內(nèi)部類(lèi)中使用。
匿名內(nèi)部類(lèi)的方法,無(wú)法直接“調(diào)用”。
只能通過(guò)匿名內(nèi)部類(lèi)重寫(xiě)外部類(lèi)的方法,才能調(diào)用。
4)、****什么時(shí)候使用匿名內(nèi)部類(lèi)?
抽象類(lèi)、接口都是無(wú)法實(shí)例化的。
抽象類(lèi) 引用 = new 抽象類(lèi)();//不可以
接口 引用 = new 接口();//不可以
如何實(shí)現(xiàn)抽象類(lèi)、接口的“實(shí)例化”?
都是先讓實(shí)體類(lèi)繼承抽象類(lèi),實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)接口,
然后通過(guò)向上造型方式,完成抽象類(lèi)、接口的“實(shí)例化”。
抽象類(lèi) 引用 = new 實(shí)體類(lèi)();//可以
接口 引用 = new 實(shí)現(xiàn)類(lèi)();//可以
如果抽象類(lèi)的實(shí)體類(lèi)、接口的實(shí)現(xiàn)類(lèi),極少使用,
那作為單獨(dú)一個(gè)類(lèi)出現(xiàn)就沒(méi)有多大意義。
實(shí)體類(lèi)、實(shí)現(xiàn)類(lèi)就可以通過(guò)匿名內(nèi)部類(lèi)方式來(lái)實(shí)現(xiàn)。
2、封裝
封裝不是單純的知識(shí)點(diǎn),而是一種思想。
方法:對(duì)特定功能代碼的封裝
類(lèi):對(duì)具有相似特征,相同行為的對(duì)象群體的封裝。
對(duì)象特征 → 類(lèi)的屬性
對(duì)象行為 → 類(lèi)的方法
子父類(lèi):對(duì)繼承、公有代碼的封裝。
抽象方法:對(duì)沒(méi)有具體實(shí)現(xiàn)的方法進(jìn)行封裝。
抽象類(lèi):對(duì)具有抽象方法的類(lèi)、對(duì)代碼需要保護(hù)的類(lèi)的封裝。
接口:對(duì)規(guī)范、標(biāo)準(zhǔn)的封裝。
內(nèi)部類(lèi):對(duì)代碼保護(hù)封裝
匿名內(nèi)部類(lèi):對(duì)抽象類(lèi)的實(shí)體類(lèi)、接口的實(shí)現(xiàn)類(lèi)的封裝。
單獨(dú)“封裝知識(shí)點(diǎn)”:
對(duì)于私有屬性、私有方法,進(jìn)行封裝。
step1:采用private訪問(wèn)權(quán)限修飾。
對(duì)屬性、方法,起到只能在本類(lèi)中才能使用。
step2:屬性賦值
方式一:
通過(guò)構(gòu)造方法,創(chuàng)建對(duì)象的同時(shí),
給私有屬性賦值。
方式二:
當(dāng)屬性添加private訪問(wèn)權(quán)限時(shí),則需要
對(duì)外提供統(tǒng)一的賦值、取值的方法入口。
賦值:set方法
取值:get方法
step3:編寫(xiě)set、get方法
a、set方法:
private String name;
public void setName(String name){
this.name = name;
}
b、get方法:
public String getName(){
return this.name;
}
步驟:
1、對(duì)私有屬性進(jìn)行private私有化操作。
2、對(duì)私有屬性向外提供統(tǒng)一的入口方法:set、get方法
為什么要私有化操作:
提高代碼的安全性。