java學習中,成員內部類、匿名內部類(java 學習中的小記錄)

來源:互聯網
上載者:User

標籤:size   虛擬機器   package   分享   匿名內部類   final   自己   color   run   

java學習中,成員內部類、匿名內部類(java 學習中的小記錄)王可利(Star·星星)

 

內部類:

一個類中定義另外一個類,這樣的類叫內部類。

內部類的檔案名稱:外部類名$內部類名.class   

 

內部類分兩種:

    1.成員內部類

        如何訪問成員內部類:

            方式1:外部類中定義一個方法來建立內部類對象,再通過對象進行訪問。

            方式2:可以直接在其他類中直接建立內部類這個對象,通過對象訪問。用點語。

                      格式:外部類名.內部類名  對象名 = new 外部類名().new 內部類名(); 

        內部類使用的注意事項:

            1.如果外部類和內部類中有同名的成員變數,那麼在內部類中java虛擬機器預設訪問內部類中的成員變數,可以通過格式: 外部類名.this.變數名。

            2.如果內部類中的成員被private 修飾了,那麼只能用方式1 來訪問內部類的成員。

            3.內部類中有變數被 static 修飾了,那麼這個類也必須是一個靜態類。

        內部類使用的好處:

            內部類中是可以直接存取外部類的所有成員。實際上還是外部類自己調用的。外部類擁有內部類。

         一般什麼時候使用內部類:

             我們在描述一個A對象,發現A對象中又需要有一個對象B,對象B很複雜,B對象又想訪問A中的資料。這個時候用內部類來描述B對象就更方便了。

             又比如說:人有心臟,人也有血液。人是一個類,心臟是一個類,血液也是一個類。 那麼心臟想訪問血液的話就很麻煩。

 1 package study; 2  3 class Outer { 4      5     int i = 10;//內建的成員變數 外部類 6      7     //定義一個內部類 8     //成員內部類 9     class Inner{10         11         int i = 20;//內部類的變數12         13         public void print() {14             System.out.println("這個是內部類"+i);//列印的是2015             System.out.println("這個是內部類"+Outer.this.i);//訪問的是外部類的屬性16         }17     }18     //建立一個方法來建立內部類對象(方式1)19 /*    public void instantce(){20         //建立內部類對象21         Inner inner = new Inner();22         inner.print();    23     }*/24 }25 //其他類26 public class star {27     public static void main(String[] args) {    28 /*        //在其他類中訪問內部類(方式1)29         Outer outer= new Outer();30         outer.instantce();*/31         32         //其他類中直接存取:(方式2)33         Outer.Inner inner = new Outer().new Inner();34         inner.print();35         36    }37 }

    2.局部內部類

        局部內部類:在類方法中定義的類,這樣的一個類叫局部內部類。

        局部內部類只能通過第一種方式來訪問。

        局部內部類使用注意點:

            如果局部內部類訪問了方法中的局部變數,方法中的局部內部類必須用final來修飾。

 1 class Outer{ 2     String name = "外部類的name"; 3     int i = 20;  4      5     public void test() { 6          7         final int i = 30;//局部變數 出了這個方法就消失。 8         //為什麼要用final來修飾? 9         /*test方法執行完,變數i 立馬從記憶體中消失,而inner對象在方法執行完之後,沒有消失的,這裡再使用i就好比把i的生命週期延遲了,與局部變數的定義不符。10          *所以用final修飾,相當於把i設定了一個複製品給test方法使用,真實的i已經消失。11          * */12         13         //局部內部類14         class Inner{15             public void print(){16                 /*int i = 10; 登出之後研究拿到30這個i*/17                 System.out.println("這個是局部內部類的方法"+i);//列印的是1018             }19         }20         //建立局部對象21         Inner inner = new Inner();//test走完,這個對象可能還存在(它是由java虛擬機器決定消除的,不知道是什麼時候),存在的話相當於給 i 的生命週期延遲了。22         inner.print();23     }    24 }25 26 public class Star {27 28     public static void main(String[] args) {29         //在其他類中訪問局部內部類30         Outer out = new Outer();31         out.test();32         33         //下面是錯誤的寫法34         /*Outer.Inner inner = new Outer().new Inner();35         inner.print();*/36     }37 }

匿名的內部類(沒有類名的類)

好處:簡化書寫

匿名內部類使用前提:外部類必須有繼承或者實現關係。

因為它沒有名字,它實際建立出來是靠父類來建立的,以多態表現出來的。所以要繼承或實現關係。

它的實現實際以多態的形式表現的所以需要滿足上面的條件。

匿名內部類一般用於實際參數的傳遞。(和匿名對象用法一樣)

abstract class Animal{    public abstract void run();    public abstract void sleep();}//外部類//在Outer裡面建立一個Dog的內部類class Outer{        //不用匿名    /*class Dog extends Animal{        public void run() {            System.out.println("狗在跑");        }        public void sleep() {            System.out.println("狗在睡覺");        }    }*/        public void print(){        //Dog d = new Dog();        //d.run();                //匿名的Dog(通過父類來完成建立)        //匿名內部類:只是沒有名字,其它的和普通的類沒什麼不一樣        Animal a = new Animal(){//不是父類建立對象 匿名內部類(子類)            //具體實現            public void run(){                System.out.println("狗在跑");            };            public void sleep(){                System.out.println("狗在睡覺");            };        };        a.run();        a.sleep();    };} public class Star {    public static void main(String[] args) {        Outer out = new Outer();        out.print();            }}

 

java學習中,成員內部類、匿名內部類(java 學習中的小記錄)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.