<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    Java語言基礎:內部類

    發布時間:2011-3-29 20:05    發布者:1770309616
    關鍵詞: Java語言基礎 , 內部類
    Java語言基礎.pdf (205.39 KB)


    1.  普通內部類
    •普通內部類的一個最簡單的例子:
    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        // 內部類   
        public class InnerClass {   
            private int i = 0;   
            public int getInt(){   
                return i;   
            }   
        }   
        public void proc(){   
            InnerClass inClass = new InnerClass();   
            System.out.println(inClass.getInt());   
        }   
    }   
       
    public class Main {      
        public static void main(String[] args) {   
            OutterClass outClass = new OutterClass();   
            outClass.proc();   
        }   
    }  
    // 外部類
    class OutterClass {
        // 內部類
        public class InnerClass {
            private int i = 0;
            public int getInt(){
                return i;
            }
        }
        public void proc(){
            InnerClass inClass = new InnerClass();
            System.out.println(inClass.getInt());
        }
    }

    public class Main {   
        public static void main(String[] args) {
            OutterClass outClass = new OutterClass();
            outClass.proc();
        }
    }
    •外部類可以訪問內部類的私有成員,內部類也可以訪問外部類的私有成員:
    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        private int mOut = 10;   
        // 內部類   
        public class InnerClass {   
            private int mIn = 0;   
            public void printOutPrivate(){   
                // 直接打印外部類的成員   
                System.out.println(mOut);   
            }   
        }   
        public void printInPrivate(){   
            InnerClass inClass = new InnerClass();   
            // 直接打印內部類的私有成員   
            System.out.println(inClass.mIn);   
        }   
        public void printOutPrivate(){   
            InnerClass inClass = new InnerClass();   
            inClass.printOutPrivate();   
        }   
    }   
       
    public class Main {      
        public static void main(String[] args) {   
            OutterClass outClass = new OutterClass();   
            outClass.printInPrivate();   
            outClass.printOutPrivate();   
        }   
    }  
    // 外部類
    class OutterClass {
        private int mOut = 10;
        // 內部類
        public class InnerClass {
            private int mIn = 0;
            public void printOutPrivate(){
                // 直接打印外部類的成員
                System.out.println(mOut);
            }
        }
        public void printInPrivate(){
            InnerClass inClass = new InnerClass();
            // 直接打印內部類的私有成員
            System.out.println(inClass.mIn);
        }
        public void printOutPrivate(){
            InnerClass inClass = new InnerClass();
            inClass.printOutPrivate();
        }
    }

    public class Main {   
        public static void main(String[] args) {
            OutterClass outClass = new OutterClass();
            outClass.printInPrivate();
            outClass.printOutPrivate();
        }
    }
    •如果外部類的成員變量與內部類的成員變量名字相同,當內部類要訪問外部類的該成員時,可以使用“OutClass.this.mem”來區分:
    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        private int mMem = 10;   
        // 內部類   
        public class InnerClass {   
            private int mMem = 0;   
            public void printOutPrivate(){   
                // 直接打印外部類的成員   
                System.out.println(OutterClass.this.mMem);   
            }   
        }   
    }  
    // 外部類
    class OutterClass {
        private int mMem = 10;
        // 內部類
        public class InnerClass {
            private int mMem = 0;
            public void printOutPrivate(){
                // 直接打印外部類的成員
                System.out.println(OutterClass.this.mMem);
            }
        }
    }
    •要創建普通內部類,必須先創建相應的外部類:
    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        private int mMem = 10;   
        // 內部類   
        public class InnerClass {   
            private int mMem = 0;   
            public void printOutPrivate(){   
                // 直接打印外部類的成員   
                System.out.println(OutterClass.this.mMem);   
            }   
        }   
    }   
       
    public class Main {      
        public static void main(String[] args) {   
            OutterClass outClass = new OutterClass();   
           OutterClass.InnerClass inClass = outClass.new InnerClass();   
            inClass.printOutPrivate();   
        }   
    }  
    // 外部類
    class OutterClass {
        private int mMem = 10;
        // 內部類
        public class InnerClass {
            private int mMem = 0;
            public void printOutPrivate(){
                // 直接打印外部類的成員
                System.out.println(OutterClass.this.mMem);
            }
        }
    }

    public class Main {   
        public static void main(String[] args) {
            OutterClass outClass = new OutterClass();
           OutterClass.InnerClass inClass = outClass.new InnerClass();
            inClass.printOutPrivate();
        }
    }
    也可以用下面的方式:
    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        private int mMem = 10;   
        // 內部類   
        public class InnerClass {   
            private int mMem = 0;   
            public void printOutPrivate(){   
                // 直接打印外部類的成員   
                System.out.println(OutterClass.this.mMem);   
            }   
        }   
        public InnerClass newInnerClass() {   
            return new InnerClass();   
        }   
    }   
       
    public class Main {      
        public static void main(String[] args) {   
            OutterClass outClass = new OutterClass();   
           OutterClass.InnerClass inClass = outClass.newInnerClass();   
            inClass.printOutPrivate();   
        }   
    }  
    // 外部類
    class OutterClass {
        private int mMem = 10;
        // 內部類
        public class InnerClass {
            private int mMem = 0;
            public void printOutPrivate(){
                // 直接打印外部類的成員
                System.out.println(OutterClass.this.mMem);
            }
        }
        public InnerClass newInnerClass() {
            return new InnerClass();
        }
    }

    public class Main {   
        public static void main(String[] args) {
            OutterClass outClass = new OutterClass();
           OutterClass.InnerClass inClass = outClass.newInnerClass();
            inClass.printOutPrivate();
        }
    }
    2.  靜態內部類
    普通內部類前面加上static修飾符,就成為靜態內部類,靜態內部類類似于C++的嵌套類,與普通內部類相比有如下區別:
    •靜態內部類沒有指向外部類的引用,外部類對于它來說更像一個名字空間。
    •普通內部類不能有靜態成員,靜態方法,或另一個靜態內部類;而靜態內部類可以有這一切。
    •靜態內部類可以直接創建,不必先創建外部類:
    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        private int mMem = 0;   
        // 靜態內部類   
        static public class InnerClass {   
            private int mMem = 0;   
            public void printOutPrivate(){   
                // 這是錯誤的   
                // System.out.println(OutterClass.this.mMem);   
            }   
        }   
        public void printInPrivate() {   
            InnerClass inClass = new InnerClass();   
            // 可以直接訪問靜態內部類的成員   
            System.out.println(inClass.mMem);   
        }   
    }   
    public class Main {      
        public static void main(String[] args) {   
            // 直接創建靜態內部類   
            OutterClass.InnerClass inClass = new OutterClass.InnerClass();   
            inClass.printOutPrivate();   
        }   
    }  
    // 外部類
    class OutterClass {
        private int mMem = 0;
        // 靜態內部類
        static public class InnerClass {
            private int mMem = 0;
            public void printOutPrivate(){
                // 這是錯誤的
                // System.out.println(OutterClass.this.mMem);
            }
        }
        public void printInPrivate() {
            InnerClass inClass = new InnerClass();
            // 可以直接訪問靜態內部類的成員
            System.out.println(inClass.mMem);
        }
    }
    public class Main {   
        public static void main(String[] args) {
            // 直接創建靜態內部類
            OutterClass.InnerClass inClass = new OutterClass.InnerClass();
            inClass.printOutPrivate();
        }
    }
    從上面描述可以看出,靜態內部類與一般類沒有太大區別,只不過它是放在一個類的里面,這個類相當于它的名字空間,可以防止命名沖突。
    3.  局部內部類
    Java可以把一個類定義在一個方法里面,甚至是一個{}塊里面,它的作用域就在這個塊里面:

    view plaincopy to clipboardprint?
    // 外部類   
    class OutterClass {   
        public void testLocalInner() {   
            if (true)   
            {   
                class LocalInner {   
                    public void proc() {   
                        System.out.println("hello");   
                    }   
                }   
                // 可以創建使用   
                LocalInner localInner = new LocalInner();   
                localInner.proc();   
            }   
            // 錯誤:超出類定義的作用域   
            LocalInner localInner = new LocalInner();   
            localInner.proc();   
        }   
    }  
    // 外部類
    class OutterClass {
        public void testLocalInner() {
            if (true)
            {
                class LocalInner {
                    public void proc() {
                        System.out.println("hello");
                    }
                }
                // 可以創建使用
                LocalInner localInner = new LocalInner();
                localInner.proc();
            }
            // 錯誤:超出類定義的作用域
            LocalInner localInner = new LocalInner();
            localInner.proc();
        }
    }
    局部內部類的一般用途是實現某個接口,并作為這個接口傳出方法被使用:

    view plaincopy to clipboardprint?
    // 接口   
    interface Talker {   
        public void Talk();   
    }   
       
    // 外部類   
    class OutterClass {   
        public Talker getTalker() {   
            // 現實該接口的局部內部類   
            class SomeTalker implements Talker {   
                public void Talk() {   
                    System.out.println("hello");   
                }   
            }   
            // 創建類實例并作為Talker返回   
            SomeTalker talker = new SomeTalker();   
            return talker;   
        }   
    }   
       
    public class Main {      
        public static void main(String[] args) {   
            OutterClass outClass = new OutterClass();   
            Talker talker = outClass.getTalker();   
            talker.Talk();   
        }   
    }  
    // 接口
    interface Talker {
        public void Talk();
    }

    // 外部類
    class OutterClass {
        public Talker getTalker() {
            // 現實該接口的局部內部類
            class SomeTalker implements Talker {
                public void Talk() {
                    System.out.println("hello");
                }
            }
            // 創建類實例并作為Talker返回
            SomeTalker talker = new SomeTalker();
            return talker;
        }
    }

    public class Main {   
        public static void main(String[] args) {
            OutterClass outClass = new OutterClass();
            Talker talker = outClass.getTalker();
            talker.Talk();
        }
    }
    4.  匿名內部類
    匿名內部類的語法如下:

    view plaincopy to clipboardprint?
    new InterfaceName(){......}; 或 new SuperclassName(){......};   
    new InterfaceName(){......}; 或 new SuperclassName(){......};  

    它被認為是InterfaceName的實現者,或是SuperclassName的繼承類,匿名內部類沒有構建函數,如果SuperclassName有帶參數的構造函數,必須在創建匿名內部類時帶上這些參數,下面是匿名內部類最常見的使用場合:

    view plaincopy to clipboardprint?
    // 接口   
    interface Talker {   
        public void Talk();   
    }   
       
    // 外部類   
    class OutterClass {   
        public void Talk(Talker talker) {   
            talker.Talk();   
        }   
    }   
       
    public class Main {      
        public static void main(String[] args) {   
            OutterClass outClass = new OutterClass();   
            // 直接生成一個匿名內部類   
            outClass.Talk(new Talker(){   
                public void Talk() {   
                    System.out.println("hello");   
                }   
            });   
        }   
    }  
    // 接口
    interface Talker {
        public void Talk();
    }

    // 外部類
    class OutterClass {
        public void Talk(Talker talker) {
            talker.Talk();
        }
    }

    public class Main {   
        public static void main(String[] args) {
            OutterClass outClass = new OutterClass();
            // 直接生成一個匿名內部類
            outClass.Talk(new Talker(){
                public void Talk() {
                    System.out.println("hello");
                }
            });
        }
    }
    本文地址:http://www.portaltwn.com/thread-60391-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷