標籤: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 學習中的小記錄)