new 接口{內部實現方法} 轉爲 匿名內部類

一、內部類

1、內部類初識

一般,一個類裏主要包含類的方法和屬性,但在Java中還提出在類中繼續定義類(內部類)的概念。

內部類的定義:類的內部定義類

先來看一個實例

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public class Out {  
  2.     private int a=1;  
  3.     //定義內部類  
  4.     class Inner  
  5.     {  
  6.         private int a=12;  
  7.         public void show()  
  8.         {  
  9.             System.out.println(a);  
  10.         }  
  11.     }  
  12.       
  13.     public static void main(String[] args) {  
  14.         Out.Inner in=new Out().new Inner();//實例化內部類  
  15.         in.show();  
  16.           
  17.     }  

     如Out類中定義一個a變量,再定義一個Inner內部類,該類可直接調用輸出a;同時爲Out設定的show方法內部類也可直接調用。內部類的提出,唯一的好處就在於可直接使用外部類(Out類)的所有屬性,不再需要通過get、set操作數據。但這種方便是以犧牲類的基本結構爲代價的。這裏需要注意的是對內部類的實例化語法。

2、 內部類對外部類的操作:內部類中的變量訪問形式

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public class Out {  
  2.     private int a=1;  
  3.     //定義內部類  
  4.     class Inner  
  5.     {  
  6.         private int a=12;  
  7.         public void show()  
  8.         {  
  9.             int a=122;  
  10.             System.out.println("局部變量:"+a);  
  11.             System.out.println("內部類變量:"+this.a);  
  12.             System.out.println("外部類變量:"+Out.this.a);  
  13.         }  
  14.     }  
  15.       
  16.     public static void main(String[] args) {  
  17.         Out.Inner in=new Out().new Inner();//實例化內部類  
  18.         in.show();        
  19.     }  
依次輸出122,12,1 ,這個實例主要是提醒大家在對具有內部類的類成員變量、內部類變量調用的時候需要注意加上對應的關鍵字。

 二、內部類的常用類型

1、常規內部類

常規內部類沒有用static修飾且定義在在外部類類體中。
  1.常規內部類中的方法可以直接使用外部類的實例變量和實例方法。
  2.在常規內部類中可以直接用內部類創建對象。

2、靜態內部類

用static修飾內部類

1.如果使用static修飾內部類,該內部類只能訪問外部類的靜態成員變量。

3、局部內部類

 內部類前加上private修飾,使得該內部類只有當前外部類方法纔可調用。其他類無實例化權限。

4、匿名內部類

這裏着重介紹匿名內部類的使用。匿名內部類:沒有名字的內部類,它的特點是隻能使用一次,通常用於簡化代碼編寫。使用匿名內部類必須繼承一個父類或實現一個接口。

   聲明和構造匿名內部類的一般格式如下:
   new ClassOrInterfaceName(){ //抽象類或接口

    /*類體*/ }

1)匿名內部類在抽象類上的應用

  不使用匿名內部類實現抽象類方法實例

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public abstract class InnerClass2 {  
  2.     public abstract void show();  
  3.       
  4.     public static void main(String[] args) {  
  5.         InnerClass2 in=new Child(); //多態,實例化子類,調用子類show方法  
  6.         in.show();  
  7.     }  
  8. }  
  9.   
  10. public class Child extends InnerClass2{  
  11.         public void show()  
  12.         {  
  13.             System.out.println("jdfklj");  
  14.         }  
  15. }  
   使用匿名類實現思路

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public abstract class Out2 {  
  2.     public abstract void show();  
  3.       
  4.     public static void main(String[] args) {  
  5.         Out2 out=new Out2()  
  6.         { //匿名類-直接實例化了out2和show 方法,在調用out.show()  
  7.             public void show()  
  8.             {  
  9.                 System.out.println("jdljsalkf");  
  10.             }  
  11.         };  
  12.         out.show();  
  13.     }     
  14. }  

    在註釋出就是使用了一個匿名類,對抽象類Out2的show實例,最後out.show()調用即可。
2)匿名內部類在接口上的應用

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public interface Out3 {//接口  
  2.     void show();  
  3.       
  4.     public static void main(String[] args) {  
  5.         Out3 out=new Out3()//new Out3  
  6.         {  
  7.             public void show()  
  8.             {  
  9.                 System.out.println("lkjdfaj");  
  10.             }  
  11.         };  
  12.     }  
  13. }  
   這裏new Out3是本片博客出生的源頭,直接new 抽象類、new 接口??how could it be? one Answer:cause it is a Anonymous Inner Class.只要是一個抽象類或接口,那就可以使用匿名內部類來實現。最常用的是在多線程中繼承Thread類或實現Runnable接口。

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public static void main(String[] args) {  
  2.         Thread thread =new Thread()  
  3.         {  
  4.             public void run()  
  5.             {  
  6.                 System.out.println("kdjfka");  
  7.             }  
  8.         };  
  9.         thread.start();  
  10.           
  11.         //接口  
  12.         Thread thread2=new Thread(new Runnable(){  
  13.             public void run()  
  14.             {  
  15.                 System.out.println("22222222");  
  16.             }  
  17.               
  18.         });   
  19.         thread2.start();  
  20.     }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章