Java提高篇(三):內部類和匿名內部類


一,內部類

其實內部類是十分簡單的,我們根據其字里行間的意義就可以知道內部類應該是一個類當中的一個類,相當於一個類進行了嵌套,就如同循環的嵌套一般。

內部類有一個特征:內部類當中可以調用外部類當中的屬性和方法,而外部類卻不能調用內部類當中的。除了這特征就沒啥特征了,我們來看看代碼了解一下(點擊代碼上方的文檔小圖標就可以復制代碼,因為我加了代碼的行號看起來整潔一些,但是復制可能不太方便):

 1 public class innerclass {  2     public static void main(String[] args) {  3         System.out.println("下面是是內部類的程序展示");  4         //創建外部類和內部類的方法有點不相同
 5         A a=new A();  6         A.B b=new A().new B();//這里開始創建內部類的對象,這是創建內部類對象的專用格式,相當於在創建了一個外部類對象的基礎上再創建一個內部類對象2  7  a.say2();  8  b.sayit();  9 } 10 } 11 class A 12 { 13     int waibu=12; 14     public void say2() 15  { 16         System.out.println("這是外部類當中的方法"); 17  } 18     class B 19  { 20         int neibu=13; 21         public void sayit() 22  { 23             System.out.println("這是內部類里面的方法"); 24             System.out.println("使用內部類和外部類當中的數值進行想加的結果是"+(neibu+waibu)); 25             //之所以內部類可以使用外部類的屬性是因為在創建對象的時候,已經給內部類的對象附加了一個外部類的對象,內部類的對象是建立在外部類對象的基礎上的。
26  } 27  } 28 }

最終的sayit()方法輸出結果是25=(13+12),從中可以證明內部類確實是可以調用外部類的屬性的,但如果外部類調用內部類的屬性則會發生報錯。

 

二.匿名內部類

首先我們應該知道匿名內部類匿名是因為匿名內部類的具體名字不會被我們在程序當眾編寫出來,因為它已經在主方法當中被實例化了。

匿名內部類可以繼承兩類數據結構:一:抽象類

二:接口。

比如我們的代碼有:

 

 1 public class innerclass {  2     public static void main(String[] args) {  3     
 4         Chouxiang c=new Chouxiang() {  5             String name="Geek Song too";  6             public void say3()  7  {  8                 System.out.println("這是匿名內部類當中的方法,重寫了抽象類的方法");  9  System.out.println(name); 10  } 11 
12 }}

 

abstract class Chouxiang { String name="Geek Song";//抽象類的屬性是不會被調用的,除了方法
public void say3() { System.out.println("這是抽象類當中的方法,抽象類當中是允許有具體方法來進行實現的,接口不行"); } }

這顯然繼承了一個抽象類,並且在主方法當中創建了抽象類的對象,本來我們是應該先繼承這個抽象類再開始創建對象的,否則對象是無法創建的,但是為了簡便,人們創建了了匿名內部類,允許我們在主方法當中進行抽象類的實例化,同時也可以進行對象的創建。這個程序就等同於如下的程序:

 1 public class innerclass {  2     public static void main(String[] args) {  3         System.out.println("下面是是內部類的程序展示");  4         //創建外部類和內部類的方法有點不相同
 5         A a=new A();  6         A.B b=new A().new B();  7  a.say2();  8  b.sayit();  9         System.out.println("現在開始匿名內部類程序的編寫\n"); 10         Chouxiang2 c=new Chouxiang2(); 11  c.say5(); 12 
13 }} 14 
15 abstract class Chouxiang 16 { 17     String name="Geek Song";//抽象類的屬性是不會被調用的,除了方法
18 public void say3() 19 { 20     System.out.println("這是抽象類當中的方法,抽象類當中是允許有具體方法來進行實現的,接口不行"); 21 } 22 
23 } 24 class Chouxiang2 extends Chouxiang 25 { 26     public void say3() 27  { 28         System.out.println("這是繼承的方法"); 29  } 30 }

因此這里就會涉及到多態和向上轉型了,我們輸出的子類的方法,父類的屬性,匿名內部類也是相同的。輸出的匿名內部類的方法,以及父類的屬性。

 

完整的程序如下,方便大家進行知識點的理解:

 

 1 public class innerclass {  2     public static void main(String[] args) {  3         System.out.println("下面是是內部類的程序展示");  4         //創建外部類和內部類的方法有點不相同
 5         A a=new A();  6         A.B b=new A().new B();  7  a.say2();  8  b.sayit();  9         System.out.println("現在開始匿名內部類程序的編寫\n"); 10         Chouxiang c=new Chouxiang() { 11             String name="Geek Song too"; 12             public void say3() 13  { 14                 System.out.println("這是匿名內部類當中的方法,重寫了抽象類的方法"); 15  System.out.println(name); 16  } 17         };//在使用匿名內部類的時候,當這個類在陳述完之后,是需要打分號的。
18  c.say3(); 19         System.out.println("我們來看看這個name到底是抽象類當中的name還是匿名內部類當中的"+c.name);//結果果然是父類當中的屬性,和我們多態的性質相重合了 20         //這就是所謂的向上轉型。現在我們再來試試接口的匿名內部類實現
21         Jiekou yui=new Jiekou() { 22             @Override//由於必須實現接口當中的方法,因此計算機就自動為我們寫上了override的標識符了
23             public void say5() { 24                 System.out.println("這是繼承的接口當中的方法"); 25  } 26  }; 27  yui.say5(); 28  } 29 } 30 class A 31 { 32     int waibu=12; 33     public void say2() 34  { 35         System.out.println("這是外部類當中的方法"); 36  } 37     class B 38  { 39         int neibu=13; 40         public void sayit() 41  { 42             System.out.println("這是內部類里面的方法"); 43             System.out.println("使用內部類和外部類當中的數值進行想加的結果是"+(neibu+waibu)); 44             //之所以內部類可以使用外部類的屬性是因為在創建對象的時候,已經給內部類的對象附加了一個外部類的對象,內部類的對象是建立在外部類對象的基礎上的。
45  } 46  } 47 } 48 //雖然內部類的程序已經成功了,但是匿名內部類的程序還沒有成功,現在我們來創建一個匿名內部類(在主方法當中,首先應該創建一個抽象類或者接口)
49 abstract class Chouxiang 50 { 51     String name="Geek Song";//抽象類的屬性是不會被調用的,除了方法
52 public void say3() 53 { 54     System.out.println("這是抽象類當中的方法,抽象類當中是允許有具體方法來進行實現的,接口不行"); 55 } 56 
57 } 58 interface Jiekou 59 { 60     public void say5(); 61 
62 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM