多態(tài)
多態(tài)的概念
一種事物的多種形態(tài)
父類變量接收子類對象
父類可以兼容子類類型。Animal aml = new Person();編譯時(shí)運(yùn)行時(shí)屏蔽子類實(shí)現(xiàn)差異
多態(tài)運(yùn)行時(shí)和編譯時(shí)過程
1.編譯時(shí),看的是父類類型,會(huì)現(xiàn)在父類中,看有不有對應(yīng)的方法,如果沒有繼續(xù)向上找{更高父類}
如果找到了,編譯通過,如果找不到,編譯失敗報(bào)錯(cuò)
2.運(yùn)行時(shí):看真實(shí)類型,如果在真實(shí)類型中找到了,就運(yùn)行真實(shí)類型中的函數(shù),如果沒有找到,向上找
問題:編譯通過了,但是運(yùn)行可不可能找不到?不可能的,因?yàn)榫幾g都已經(jīng)說明了,上面一定有
多態(tài)的應(yīng)用實(shí)例:發(fā)現(xiàn)多態(tài)的好處,多態(tài)屏蔽了不同子類的實(shí)現(xiàn)差異
子類的實(shí)現(xiàn)?子類可以覆寫父類的方法的
體現(xiàn)java代碼多態(tài)的幾種情況分析
多態(tài)的應(yīng)用實(shí)例:發(fā)現(xiàn)多態(tài)的好處,多態(tài)屏蔽了不同子類的實(shí)現(xiàn)差異
子類的實(shí)現(xiàn)?子類可以覆寫父類的方法的
數(shù)據(jù)類型轉(zhuǎn)換
為什么需要引用類型數(shù)據(jù)轉(zhuǎn)換
為什么需要數(shù)據(jù)類型轉(zhuǎn)換呢?
1.繼承關(guān)系:父類提取的是共性:明白,子類是有自己特性的
2.開發(fā)中,我們采用了多態(tài)的寫法,出現(xiàn)問題:編譯只看類型
3.怎么解決呢?
例:還原真實(shí)類型【Animal類型變成CoffeCat】數(shù)據(jù)類型的轉(zhuǎn)換
引用類型數(shù)據(jù)轉(zhuǎn)換的兩種情況
引用【數(shù)據(jù)類型】轉(zhuǎn)換的幾種情況
1.小轉(zhuǎn)大【自動(dòng)類型轉(zhuǎn)換】:子類類型轉(zhuǎn)換成父類類型
??Animal aml = new CoffeCat();
2.大轉(zhuǎn)小【強(qiáng)制類型轉(zhuǎn)換】:父類類型轉(zhuǎn)換成子類類型
數(shù)據(jù)類型變量名= (數(shù)據(jù)類型)值;
引用類型的數(shù)據(jù)轉(zhuǎn)換的注意事項(xiàng)
引用數(shù)據(jù)類型轉(zhuǎn)換的注意事項(xiàng):
在類型轉(zhuǎn)換之前應(yīng)該要[先判斷類型],確保類型正確,再做轉(zhuǎn)換
分析
1.編譯:只看類型不看值
Animal aml = new CoffeCat();
Tomcat tc = (Tomcat)aml;
2.編譯:運(yùn)行
編譯:只看類型不看值,我們第二行代碼,大轉(zhuǎn)小,沒問題
運(yùn)行:看真實(shí)類型:把一個(gè)CoffeCat變成一個(gè)Tomcat ?:不行
Exception in thread "main" java.lang.ClassCastException: CoffeCat cannot be cast to Tomcat
final
final修飾符及可修飾內(nèi)容測試
1.final可修飾的內(nèi)容的測試
class Student{
String name;
void eat(){
int i = 10;
}
Student(){
}
class A{}
}
1.可以修飾類
2.可以修飾變量
3.可以修飾普通方法
不能修飾構(gòu)造方法
修飾類的效果
最終類:沒有子類
修飾普通方法的效果
final修飾的方法不能覆寫
static修飾的方法不能覆寫
private修飾的方法不能覆寫
修飾變量的效果
.可以修飾變量:不可變的:
變量這個(gè)容器:如果裝了值,用final修飾了,不能改變值
單例模式
單例模式
概念:
設(shè)計(jì)類:只產(chǎn)生一個(gè)受保護(hù)的對象
餓漢模式及特點(diǎn):
class A{
private A(){//創(chuàng)建一個(gè)私有的無參構(gòu)造(防止外部創(chuàng)建對象)
}
private static A instance=new A();//因?yàn)橐陟o態(tài)上下文中調(diào)用所以用static修飾
public static A getInstance(){//類名.方法名調(diào)用方法得到對象
return instance;
}
}
為什么要叫做惡漢:不管你用還是不用A對象,都先給你創(chuàng)建一個(gè)出來
1.計(jì)算機(jī)啟動(dòng):有些軟件不用,開機(jī)就啟動(dòng),系統(tǒng)的效率
2.啟動(dòng)軟件的時(shí)候:惡漢模式有些對象都不用,都直接啟動(dòng)創(chuàng)建,軟件啟動(dòng)的效率會(huì)降低
懶漢模式及特點(diǎn)
class A{
private A(){//創(chuàng)建私有化的構(gòu)造方法防止外部創(chuàng)建對象
}
private static A instance;//聲明一個(gè)A的對象null
public static A getInstance(){
if(instance==null){//需要時(shí)創(chuàng)建對象
return new A();
}
return instance;//返回對象
}
}
單例模式之懶漢模式:需要的時(shí)候才創(chuàng)建
之所以叫懶漢:因?yàn)橹灰悴挥?,我就不?chuàng)建,只有需要的時(shí)候才創(chuàng)建
1.好處:效率高
2.壞處:線程不安全:導(dǎo)致我們拿到的對象不是一個(gè)對象,新的對象出現(xiàn)