#千峰#days11內(nèi)部類箱季、異常

一涯穷、設(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);
    }
    
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庸毫,一起剝皮案震驚了整個濱河市仔拟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飒赃,老刑警劉巖利花,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異载佳,居然都是意外死亡炒事,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門蔫慧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挠乳,“玉大人,你說我怎么就攤上這事姑躲∮辏” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵肋联,是天一觀的道長威蕉。 經(jīng)常有香客問我,道長橄仍,這世上最難降的妖魔是什么韧涨? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮侮繁,結(jié)果婚禮上虑粥,老公的妹妹穿的比我還像新娘。我一直安慰自己宪哩,他們只是感情好娩贷,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锁孟,像睡著了一般彬祖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上品抽,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天储笑,我揣著相機與錄音,去河邊找鬼圆恤。 笑死突倍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羽历,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼焊虏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秕磷?” 一聲冷哼從身側(cè)響起炕淮,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跳夭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體们镜,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡币叹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了模狭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颈抚。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嚼鹉,靈堂內(nèi)的尸體忽然破棺而出贩汉,到底是詐尸還是另有隱情,我是刑警寧澤锚赤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布匹舞,位于F島的核電站,受9級特大地震影響线脚,放射性物質(zhì)發(fā)生泄漏赐稽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一浑侥、第九天 我趴在偏房一處隱蔽的房頂上張望姊舵。 院中可真熱鬧,春花似錦寓落、人聲如沸括丁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史飞。三九已至,卻和暖如春仰税,著一層夾襖步出監(jiān)牢的瞬間祸憋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工肖卧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚯窥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像拦赠,于是被迫代替她去往敵國和親巍沙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容