<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-159  評(píng)論-114  文章-7  trackbacks-0
    內(nèi)部類(lèi),使用內(nèi)部類(lèi)使編程更有層次,結(jié)構(gòu)更清晰,但一切能用內(nèi)部類(lèi)解決的問(wèn)題,外部類(lèi)都能解決,只是編碼是否繁瑣的問(wèn)題。

    內(nèi)部類(lèi),是作為外部類(lèi)的成員。

    內(nèi)部類(lèi),修飾符可以為private protected static

    四種內(nèi)部類(lèi)

    成員內(nèi)部類(lèi)   局部?jī)?nèi)部類(lèi)   靜態(tài)內(nèi)部類(lèi)   匿名內(nèi)部類(lèi)

    1.成員內(nèi)部類(lèi),可以作為外部類(lèi)的成員。

    既然作為成員,那么四種訪(fǎng)問(wèn)修飾符適用。
    優(yōu)點(diǎn):1任意訪(fǎng)問(wèn)外部類(lèi)私有成員(屬性,方法)
                2 定義比private還要小的訪(fǎng)問(wèn)控制權(quán)限(對(duì)于外部類(lèi)) 
                3 成員內(nèi)部類(lèi),不能有靜態(tài)屬性。

    public class Outer {
        
    private int index = 100;
        
        
    /** Creates a new instance of Outer */
        
    public Outer() {
        }

        
        
    class Inner
        
    {
            
    private int index = 50;
            
    void print()
            
    {
                
    int index = 30;
                System.out.println(index);
    //局部變量30
                System.out.println(this.index);//內(nèi)部類(lèi)當(dāng)前對(duì)象的index
                System.out.println(Outer.this.index);//引用外部類(lèi)對(duì)象index
            }

        }

        
        
    public static void main(String[] args)
        
    {
            Outer outer 
    = new Outer();
            Outer.Inner oi 
    = outer.new Inner();
            oi.print();
        }

        
    }

    成員內(nèi)部類(lèi)對(duì)象依附于外部類(lèi)對(duì)象。

    所以,如果一個(gè)外部類(lèi)繼承另外一個(gè)類(lèi)的內(nèi)部類(lèi),那么這個(gè)類(lèi)的構(gòu)造函數(shù)必須需要一個(gè)那個(gè)內(nèi)部類(lèi)的外部類(lèi)對(duì)象作為參數(shù)傳入,才能成功構(gòu)造該類(lèi)對(duì)象。

    class WithInner {
      
    class Inner {}
    }

    public class InheritInner extends WithInner.Inner {
      
    //! InheritInner() {} // Won't compile
      InheritInner(WithInner wi) {
        wi.
    super();
      }

      
    public static void main(String[] args) {
        WithInner wi 
    = new WithInner();
        InheritInner ii 
    = new InheritInner(wi);
      }

    }


    局部?jī)?nèi)部類(lèi)

    public class Outer {
        
    private int index = 100;
        
        
    /** Creates a new instance of Outer */
        
    public Outer() {
        }


        
    void fn(final int a)
        
    {
            
    final int b = 0;
            
    class Inner
            
    {
                
    int index = 50;
                
    void print()
                
    {
                    
    int index = 30;
                    System.out.println(
    this.index);
                    System.out.println(Outer.
    this.index);
                    System.out.println(a);
                    System.out.println(b);
                }

            }

            Inner in 
    = new Inner();
            in.print();
        }


        
    public static void main(String[] args)
        
    {
            Outer outer 
    = new Outer();
            outer.fn(
    10000);
        }
       
    }

    可以訪(fǎng)問(wèn)實(shí)例變量,通過(guò)外部類(lèi)當(dāng)前對(duì)象。Outer.this
    可以使用局部變量,但這些變量必須是final的。

    局部?jī)?nèi)部類(lèi)前沒(méi)有訪(fǎng)問(wèn)控制修飾符,因?yàn)樽饔糜蚓褪窃诜椒▋?nèi)部,指定無(wú)意義。

    局部?jī)?nèi)部類(lèi)對(duì)于外部類(lèi)是透明的。


    靜態(tài)內(nèi)部類(lèi)

    public class Outer {
        
    private int index = 100;
        
        
    private static int index_static = 100;

         
    /** Creates a new instance of Outer */
        
    public Outer() {
        }


        
    static class StaticInner{
            
    private int index = 50;
            
    void print()
            
    {
                
    int index = 30;
                System.out.print(index);
                System.out.print(
    this.index);
                System.out.print(Outer.index_static);
            }

            
        }


        
    public static void main(String[] args)
        
    {
            Outer.StaticInner st 
    = new Outer.StaticInner();
            st.print();

        }

        
    }

    靜態(tài)內(nèi)部類(lèi)只能訪(fǎng)問(wèn)外部類(lèi)的靜態(tài)成員(屬性,方法)
    創(chuàng)建對(duì)象,不依賴(lài)于外部類(lèi)對(duì)象,是一個(gè)頂級(jí)類(lèi)。

    Outer.Inner in = new Outer.Inner();
    in.***();

    內(nèi)部類(lèi)重要用途,接口配合內(nèi)部類(lèi)實(shí)現(xiàn)完全的C++多繼承功能。

    接口不能完全實(shí)現(xiàn)多繼承,簡(jiǎn)單例子,就是如果一個(gè)機(jī)器人Robet,父類(lèi)People,機(jī)器Machine。
    class People{

    public void run(){}//跑

    }

    interface Machine{

    void run(){}//運(yùn)行

    }

    子類(lèi)的run方法無(wú)法實(shí)現(xiàn)。類(lèi)與接口的命名沖突,需要借助內(nèi)部類(lèi)。

    public class Robot extends People{
        
        
    /** Creates a new instance of Robot */
        
    public Robot() {
        }

        
        
    public void run(){
            System.out.println(
    "機(jī)器人跑");
        }

        
        
    class Heart implements Machine{
            
    public void run()
            
    {
                System.out.println(
    "心臟跳動(dòng)");
            }

        }

    }


    abstract class People{    
        
    abstract public void run();    
    }


    interface Machine{
        
    void run();
    }

    r = new Robet();r.run();

    Robet.Heart h = r.new Heart();

    h.run();

    匿名內(nèi)部類(lèi)*

    public class OuterNoName {
        
        
    /** Creates a new instance of OuterNoName */
        
    public OuterNoName() {
        }

        
        
    public OuterNoName(IA impl)
        
    {
            impl.run();
        }

        
        
    public static void main(String[] args)
        
    {
            OuterNoName onn 
    = new OuterNoName(new IA(){
                    
    public void run(){
                        System.out.println(
    "匿名內(nèi)部類(lèi)");
                    }
                    
            }
    );
        }

        
    }


    interface IA{    
        
    void run();
    }


    構(gòu)造函數(shù)參數(shù)傳入時(shí),直接生成一個(gè)實(shí)現(xiàn)IA接口的匿名內(nèi)部類(lèi)的對(duì)象。調(diào)用run方法時(shí),多態(tài)會(huì)找到這個(gè)不知道叫什么名字的類(lèi)的覆蓋方法。

    實(shí)現(xiàn)接口或者類(lèi)

    1在new后面使用,隱含著實(shí)現(xiàn)接口或者類(lèi),父類(lèi)類(lèi)型。
    2 其他遵循局部?jī)?nèi)部類(lèi)的規(guī)則
    3無(wú)構(gòu)造函數(shù)。無(wú)名嘛

    ===============================================

    Exception

    java.lang.Throwable是java.lang.Error和java.lang.Exception的父類(lèi)。

    java.lang.Error是指底層的,低級(jí)的,嚴(yán)重的,不可恢復(fù)的錯(cuò)誤,例如內(nèi)存不足等。
    程序一定會(huì)退出。

    java.lang.Exception是程序員關(guān)注的重點(diǎn),例外又分為RunTime Exception未檢查例外和已檢查例外。

    未檢查例外是由于程序的大意,沒(méi)有相應(yīng)的檢查,而出的例外。此類(lèi)異常是可以避免的。
    此類(lèi)問(wèn)題應(yīng)提前提供應(yīng)對(duì)策略,是可能出現(xiàn)的錯(cuò)誤提前應(yīng)對(duì)。

    例如除0,數(shù)組越界,強(qiáng)制類(lèi)型轉(zhuǎn)換錯(cuò)誤ClassCastException,等。java.lang.RuntimeException的子類(lèi)都是未檢查錯(cuò)誤,去查API。

    所以是編程避免。


    已檢查例外是需要程序處理的。

    兩種方式:
    1.方法throws Exception
    2.
    try{
    ...
    }catch(Exception ex)
    {
    ...
    }
    finally
    {
    ...
    }

    第一種是一種消極的處理方式,第二種是一種積極的處理方式。

    如果不處理,程序非正常退出,影響出現(xiàn)其他代碼正常運(yùn)行,盡管他們沒(méi)有關(guān)系。

    Java是在網(wǎng)絡(luò)上傳輸字節(jié)碼。所以不會(huì)讓程序中出現(xiàn)永遠(yuǎn)運(yùn)行不到的語(yǔ)句,就是不能有廢話(huà)。不能存在unreachable statement。

    public class TestException {
        
        
    /** Creates a new instance of TestException */
        
    public TestException() {
        }

        
        
    public static void main(String[] args) throws Exception
        
    {
            System.out.println(
    "main1");
            System.out.println(
    "main2");
            print();
            System.out.println(
    "main3");
        }

        
        
    public static void print() throws Exception{
            System.out.println(
    "print1");
            System.out.println(
    "print2");
            subPrint();
            System.out.println(
    "print3");
        }

        
        
    public static void subPrint() throws Exception{
            System.out.println(
    "subprint1");
            System.out.println(
    "subprint2");
            
    throw new Exception();
            
    //System.out.println("subprint3");        unreachable statement
        }

    }

    應(yīng)用try...catch...finally處理異常,保證程序正常退出。

        public static void main(String[] args)
        
    {
            System.out.println(
    "main1");
            System.out.println(
    "main2");
            
    try{
            print();
            }

            
    catch(IOException e){}
            
    catch(Exception ex){}
            
    finally{
                System.out.println(
    "Run me whatever!");
            }

            System.out.println(
    "main3");
        }


    catch可以有多個(gè),但一個(gè)異常只能匹配一個(gè),而且catch的Exception從上到下,是子類(lèi)到父類(lèi)的順序,不可顛倒。

    try塊中,有語(yǔ)句可能運(yùn)行不到,finally無(wú)論如何都會(huì)被執(zhí)行,即使catch塊中有return語(yǔ)句,除非有System.exit(0);不會(huì)走finally塊。

    finally塊中,主要放置釋放資源,斷開(kāi)網(wǎng)絡(luò)連接的代碼。

        public static void main(String[] args)
        
    {
            System.out.println(cal(
    0));
            System.out.println(cal(
    1));
            System.out.println(cal(
    2));
        }

        
    public int cal(int n)
        
    {
            
    try{
                
    int r = (int)(2/n);
                
    return r;
            }

            
    catch(Exception ex){return 1;}
            
    finally{
                
    if(n == 2return 0;
            }

        }

    一定要執(zhí)行finally塊語(yǔ)句,所以傳入?yún)?shù)為2時(shí),try計(jì)算完1,不能馬上執(zhí)行return,而是執(zhí)行finally,最后執(zhí)行finally塊中的return。


    ex.getMessage() ------>Exception(String message),注意需要構(gòu)造對(duì)象時(shí)采用有參構(gòu)造方法
    ex.printStackTrace(),打印堆棧信息,最早出現(xiàn)位置,途經(jīng)哪個(gè)方法。

    開(kāi)發(fā)一般規(guī)律:

    1.try范圍控制確定
    寫(xiě)程序,聯(lián)動(dòng)操作,如果第一件事與第二件事無(wú)關(guān),不要放置于同一個(gè)try塊中。
    如果第一件事影響到第二件事,放在一起。

    2.try...catch,這種積極的處理方式,放置于最有能力處理的地方,否則采用throws方式,將例外拋給調(diào)用者。

    聯(lián)想:一個(gè)人要辦一件事,他需要一個(gè)中介來(lái)辦理,那么他將材料給了代理人,代理將材料提交給執(zhí)行機(jī)構(gòu),辦理過(guò)程中,執(zhí)行機(jī)構(gòu)發(fā)現(xiàn)材料不全,告知代理人,代理是沒(méi)有能力來(lái)處理這件事的,只得再告知辦理人,由辦理人再行辦理。


    自定義例外

    class MyException extends Exception{
       public MyException(String message)
       {
          super(message);
       }
    }

    ==>throw new MyException("");


    覆蓋方法時(shí),覆蓋方法的例外拋出類(lèi)型和數(shù)量有限制,類(lèi)型相等,或者是被覆蓋方法例外類(lèi)型的字類(lèi)型,數(shù)量只能更少。

    try必須和catch或者finally配套出現(xiàn)。任何代碼塊中都可以再次嵌套try...catch...finally。








     



    posted on 2005-12-03 19:59 北國(guó)狼人的BloG 閱讀(433) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 達(dá)內(nèi)學(xué)習(xí)總結(jié)
    主站蜘蛛池模板: 99精品全国免费观看视频..| 国产在线19禁免费观看国产 | 亚洲?V乱码久久精品蜜桃 | 亚洲va国产va天堂va久久| 免费精品国产自产拍在线观看| 巨胸喷奶水视频www网免费| 亚洲天堂一区二区三区四区| 国产在线观看免费视频软件| 亚洲精品国产V片在线观看| 韩国亚洲伊人久久综合影院| 免费视频中文字幕| 亚洲国产精品一区二区三区在线观看| 99久久免费精品高清特色大片| 国产亚洲3p无码一区二区| 亚洲五月午夜免费在线视频| 亚洲国产精品丝袜在线观看| 黄页网站在线免费观看| 国产成人无码a区在线观看视频免费| 成人区精品一区二区不卡亚洲| 免费国产成人高清在线观看网站 | 国产精品国产免费无码专区不卡| 最新亚洲精品国偷自产在线| 成人性生交大片免费看无遮挡 | 免费A级毛片无码视频| 亚洲国产成人久久精品动漫 | 在线精品亚洲一区二区小说| 九一在线完整视频免费观看| 亚洲av再在线观看| 麻豆安全免费网址入口| 日韩精品成人亚洲专区| 色多多www视频在线观看免费| 亚洲精品国产综合久久一线| av电影在线免费看| 曰韩亚洲av人人夜夜澡人人爽| 久久久受www免费人成| 亚洲无码在线播放| 精品在线免费观看| 亚洲国产老鸭窝一区二区三区| 日韩免费无码一区二区三区| 久久精品国产亚洲AV大全| 免费观看国产网址你懂的|