一涯穷、設(shè)計模型之模板模型
1、定義
藏雏。實現(xiàn)類和接口中的方法保持一致
拷况。為什么要保持一致? 為了擴展性,我們要求赚瘦,是實際編程中粟誓,
盡量使用多態(tài),使用多態(tài)的過程中起意,我們發(fā)現(xiàn)鹰服,如果子類中有特有
方法,那么揽咕,無法使用悲酷,所以,我們要求亲善,盡量讓子類和父類中的
方法保持一致设易,開發(fā)中,我們又發(fā)現(xiàn)逗爹,接口作為父類的情況較多亡嫌,
當(dāng)接口作為父類,實現(xiàn)類和接口中的方法保持一致時掘而,我們稱這種現(xiàn)象
為模板模型挟冠。
。使用接口指定規(guī)則袍睡,然后子類根據(jù)實現(xiàn)不同的方法內(nèi)部代碼
知染。實現(xiàn)類暴露的可用方法必須和接口中相同
二、成員內(nèi)部類
斑胜。成員內(nèi)部類作用:對類中的成員再次整理
1控淡、定義:
。內(nèi)部類就是在類的內(nèi)部定義另一個類
2止潘、使用:
掺炭。內(nèi)部類可以直接訪問外部類的成員,包括私有
凭戴。外部類名.this .成員
涧狮。外部類調(diào)用內(nèi)部類方法,必須先創(chuàng)建對象
么夫。內(nèi)部類名 對象 = 內(nèi)部類對象
者冤。內(nèi)部類 對象名 = new 內(nèi)部類()
public class Outer{
//外部類非靜態(tài)方法
public void outerMethod(){
System.outprintln("外部類方法");
//外部類調(diào)用內(nèi)部類方法 必須先創(chuàng)建內(nèi)部類對象
Inner inner = new Inner();
inner.innerMethod();
}
class Inner{
//內(nèi)部類非靜態(tài)方法
public void innerMethod(){
//內(nèi)部類調(diào)用外部類非靜態(tài)方法
//Outer.this.outerMethod();
//如果沒有相同的方法 可以省略前綴
outerMethod();
}
}
}
3、別的類要訪問內(nèi)部類的成員档痪,就必須創(chuàng)建對象
涉枫。外部類名.內(nèi)部類名 對象名 = 外部類對象.內(nèi)部類對象
。外部類.內(nèi)部類 對象名 = new 外部類().new 內(nèi)部類()
public static void mian(String[] args){
//創(chuàng)建內(nèi)部類對象腐螟,必須要先創(chuàng)建外部類對象
Outer.Inner inner = new Outer().new Inner();
//調(diào)用內(nèi)部類方法
inner.innerMethod();
}
4愿汰、內(nèi)部類的權(quán)限
困后。內(nèi)部類的權(quán)限和成員方法一樣,可以有private 默認(rèn)protected
public
尼桶。外部類只能是public和默認(rèn)的
操灿。private效果等同于私有化方法,別的類無法直接調(diào)用泵督,但是外部類
可以調(diào)用趾盐,可以通過方法return回去
。我們完全可以把內(nèi)部類當(dāng)做是一個類中的方法來看待
小腊。內(nèi)部類同時具有方法和類的所有權(quán)益
public class Outer{
//外部類非靜態(tài)方法
public void outerMethod(){
//私有化的內(nèi)部類只能在外部類中使用
Inner inner = new Inner();
inner.innerMethod();
}
//只能在內(nèi)部類使用
private class Inner{
//內(nèi)部類非靜態(tài)方法
public void innerMethod(){
}
}
public static void main(String[] args){
Outer.Inner inner = new Outer().new Inner();//報錯
}
}
5救鲤、注意事項:
。成員內(nèi)部類中方法可以隨意調(diào)用外部類的方法秩冈,因為安全本缠。
。成員內(nèi)部類方法可用時入问,說明成員內(nèi)部類對象一定存在丹锹,
成員內(nèi)部類對象存在,說明外部類對象一定存在
芬失。外部類的方法無法直接調(diào)用成員內(nèi)部類的方法
楣黍。因為外部類方法可用時,我們不確定內(nèi)部類對象就一定存在
棱烂,就是存在租漂,也有可能有多個內(nèi)部類的對象
三、靜態(tài)內(nèi)部類
颊糜。
1哩治、定義:
。使用static 關(guān)鍵字修飾內(nèi)部類
2衬鱼、使用
业筏。調(diào)用靜態(tài)內(nèi)部類內(nèi)部的非靜態(tài)方法
。外部類名.內(nèi)部類名 對象名 = new 外部類名.內(nèi)部類名()鸟赫;
public calss Outer{
//靜態(tài)內(nèi)部類
public static class Inner(){
//靜態(tài)內(nèi)部類的非靜態(tài)方法
public void innerMethod(){
}
}
}
public static void main(String[] args){
//創(chuàng)建內(nèi)部類對象
Outer.Inner inner = new Outer.Inner();
//調(diào)用內(nèi)部類的方法
inner.innerMethod();
}
蒜胖。調(diào)用靜態(tài)內(nèi)部類內(nèi)部的靜態(tài)方法
。外部類名.內(nèi)部類名.方法名()
public class Outer{
//靜態(tài)內(nèi)部類
public static class Inner{
//靜態(tài)內(nèi)部類的靜態(tài)方法
public static void innerMethod(){
}
}
}
public static void main(String[] args){
//類名調(diào)用
Outer.Inner.innerMethod();
}
惯疙。靜態(tài)內(nèi)部類調(diào)用外部類的非靜態(tài)方法
。必須先new出外部類然后才能調(diào)用
public class Outer{
//外部類非靜態(tài)方法
public void outerMethod(){
System.out.println("外部類的非靜態(tài)方法");
}
//靜態(tài)內(nèi)部類
piublic static class Inner{
//靜態(tài)內(nèi)部類非靜態(tài)方法
public void innerMethod(){
//必須先創(chuàng)建外部類對象
new.Outer().outerMethod();
}
}
}
3妖啥、注意事項
霉颠。內(nèi)部類中如果有靜態(tài)方法,那么內(nèi)部類也必須是靜態(tài)的
荆虱。內(nèi)部類是靜態(tài)的蒿偎,并不意味著內(nèi)部類中的方法都是靜態(tài)的朽们,只是說
明我們可以繞過外部類對象直接找到內(nèi)部類來使用
。在靜態(tài)內(nèi)部類中诉位,可以使用外部類的靜態(tài)成員骑脱,不可以使用外部類的
非靜態(tài)成員
。在靜態(tài)內(nèi)部類中苍糠,
四叁丧、局部內(nèi)部類
1、定義:
岳瞭。定義在類中的方法中的內(nèi)部類叫做局部內(nèi)部類
2拥娄、使用:
。極端情況下有用:一個方法內(nèi)的代碼在當(dāng)前方法內(nèi)需要重復(fù)使用多次
瞳筏,當(dāng)出了這個方法就有用處了
稚瘾。局部內(nèi)部類的作用范圍僅限本方法中
。局部內(nèi)部類在訪問它所在方法中的局部變量必須使用final
修飾
姚炕。局部內(nèi)部類想要使用局部變量摊欠,那么,變量必須變成常量
柱宦。因為當(dāng)調(diào)用這個方法時些椒,局部變量如果沒有用final修飾,它的生命
周期和方法的生命周期是一樣的捷沸,當(dāng)方法彈棧摊沉,這個局部變量也會
消失,那么如果局部內(nèi)部類對象還沒有麻黃素那個消失想用這個變
量痒给,就沒有了说墨,如果用final修飾會在類加載的時候進入常量池,即使
方法彈棧苍柏,常量池的常量還在尼斧,也可以繼續(xù)使用
。jdk1.8取消的這個定義试吁,其實不是取消了棺棵,是設(shè)置為了隱式的
public static void main(String[] args){
//局部內(nèi)部內(nèi)使用局部變量必須是final的
final String name = "小紅";
//局部內(nèi)部類
class Inner{
public void method(){
System.out.println("局部內(nèi)部類");
}
public String method2(){
return name+ "愛你";
}
}
Inner inner = new Inner();
inner.method();
inner.method2();
}
五、匿名內(nèi)部類
1熄捍、定義:
烛恤。匿名內(nèi)部類就是局部內(nèi)部類的簡寫形式,相當(dāng)于是一個
沒有名字的子類
余耽。匿名內(nèi)部類用于定義接口的或者類的子類
2缚柏、使用:
。前提是必須存在一個類碟贾,或者接口
币喧。這里的類可以是具體的類也可以是抽象的
轨域。相當(dāng)于是一個沒有名字的子類繼承或者實現(xiàn)一個類或者接口
,然后重寫里面的方法杀餐,本質(zhì)是一個繼承了該類或者實現(xiàn)了該
接口的匿名子類對象
干发。多用于規(guī)則簡單,子類使用很少的接口應(yīng)用中
3史翘、格式:
枉长。new 類名或者接口名(){
重寫方法;
}
4恶座、演示:
public static void main(String[] args){
//匿名內(nèi)部類
MyInterface mi = new MyInterface(){
@Override
public void method(){
System.out.println("重寫接口的方法");
}
};
}
六搀暑、異常
1、定義:
跨琳。異常是指java程序在運行過程中出現(xiàn)的錯誤Throwable
2自点、分類:
。Error 錯誤 致命的錯誤 比如數(shù)據(jù)庫崩潰 服務(wù)器宕機
脉让。Exception 異常 局部行的錯誤桂敛, 警報 告訴開發(fā)者程序有問題
或可能出現(xiàn)問題
。編譯時異常
溅潜。因為語法不規(guī)范术唬,對代碼沒有進行預(yù)制處理導(dǎo)致異常,編譯器
可以檢查出來滚澜,如果不處理粗仓,編譯無法通過
。運行時異常 導(dǎo)致程序停止運行
设捐。編譯時期不報錯借浊,運行時報錯
。常見的角標(biāo)越界萝招,空指針等都是運行時異常蚂斤,也就是只有運行起
來才能發(fā)現(xiàn)的,這是程序員犯的錯誤
七槐沼、異常的處理
曙蒸。異常:程序發(fā)生問題,無法繼續(xù)運行
岗钩。運行時異常:這個問題是程序運行起來之后纽窟,才發(fā)生的
。編譯時異常:這個問題是在編譯時發(fā)生的
1兼吓、jvm是如何處理異常的
臂港。運行時出現(xiàn)異常,jvm打印異常信息,并停止運行
2趋艘、手動處理異常的兩種方式
。抓取異常并處理
凶朗。對異常進行處理后瓷胧,程序依然可以繼續(xù)執(zhí)行
。手動拋出異常
棚愤。程序會在拋出異常的點上停止運行并將異常信息拋出
3搓萧、抓取處理方式
。try{} catch(異常類型){}
public static void main(String[] args){
int i = 0;
try{
//將可能出現(xiàn)異常的代碼包裹起來
int num = 10/i ;
}catch(Exception e){
//對相應(yīng)類型的異常信息進行處理
e.printStackTrace();//打印異常信息
}
}
宛畦。try{}catch(異常類型){} catch(異常類型){}.....
public static void mian(String[] args){
int i = 0;
try{
//將可能出現(xiàn)異常的代碼包裹起來
int num = 10/i;
}catch(ArithmeticException e){
//對相應(yīng)類型的異常信息進行處理
e.printStackTrace();//打印異常信息
}catch(Exception e){
//對相應(yīng)類型的異常信息進行處理
e.printStackTrace();//打印異常信息
}
}
瘸洛。try{}catch(異常類型){}finally{}
public static void main(String[]args){
int i = 0 ;
try{
//將可能出現(xiàn)異常的代碼包裹起來
int num =10/i;
}catch(ArithmeticExcaption e){
//對相應(yīng)類型的異常信息進行處理
e.printStackTrace();//打印異常信息
}catch(Exception e){
e.printStackTrace();
}finally{
//最后一定會執(zhí)行的代碼
System.out.println("這個體系中最后執(zhí)行的代碼");
}
}
4次和、拋出異常方式
反肋。使用throws關(guān)鍵字在方法聲明后拋出異常
。接收到異常的方法要么拋出要么處理
踏施。方法聲明上的異常類型必須大于等于程序中出現(xiàn)的異常
類型才能拋出
5石蔗、注意事項
。多個catch處理異常時畅形,遵循從上往下的原則养距,上面如果有
catch可以處理,下面將不再執(zhí)行日熬,所以我們應(yīng)當(dāng)將小的異常
放在上面棍厌,大的異常放在下面
。無論什么情況竖席,只要try...catch體系執(zhí)行了耘纱,finally中的代碼一定
會執(zhí)行的,除非虛擬機退出:System.exit(0)
怕敬。finally主要是用于釋放資源
八揣炕、自定義異常(了解)
1.定義:
。在項目中我們有時需要處理一些邏輯的問題东跪,比如說性別不能輸入中
性畸陡,這些在java中不被認(rèn)為是異常,但是在實際的業(yè)務(wù)中卻是異常
虽填。自定義異常有時名稱的丁恭,所以比單純的狀態(tài)值更好記憶
。自定義異常類斋日,可以攜帶更多的信息供我們使用
牲览。拋出遺產(chǎn)的方式不會破壞方法的格式
2、自定義異常
恶守。繼承Exception 必須拋出第献,需要在編譯前處理
贡必。繼承RuntimeException 不需要拋出,編譯前不許要處理
//自定義編譯時異常
public class MyException extends Exception{
//定義空參構(gòu)造
public MyException(){}
//定義有參構(gòu)造
public MyException(String message){
//將信息傳遞過父類處理
super(message);
}
}
//自定義運行時異常
public class MyException extends RuntimeException{
//定義空參構(gòu)造
public MyException(){}
//定義有參構(gòu)造
public MyException(String message){
//將信息傳遞過父類處理
super(message);
}
}