Java基礎_內部類、靜態內部類、成員內部類、局部內部類、匿名內部類 (轉)


From: http://www.itzhai.com/java-based-notebook-a-static-inner-class-within-a-class-member-within-the-class-of-local-inner-classes-anonymous-inner-classes.html

內部類:

使用內部類減少了命名沖突。

一個內部類可以定義在一個類中,一個方法中甚至一個表達式中。
內部類分為四種:
靜態內部類(static inner classes)
成員內部類(member inner classes)
局部內部類(local inner classes)
匿名內部類(anonymous inner classes)

1、靜態內部類(static inner classes)

最簡單的內部類。

只能訪問外部類的靜態成員變量與靜態方法。

生成靜態內部類對象的方法:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

1.1、相關使用例子:

靜態內部類:

 1 class StaticInner{
 2     private static int a = 1;
 3 
 4     /**
 5    * 靜態內部類
 6    * 生成的類名:StaticInner$InnerClass
 7    */
 8     public static class InnerClass{
 9         //靜態內部類可以聲明靜態的成員變量,其他的內部類不可以
10         private static int b = 1;
11         public void execute(){
12             //靜態內部類只能訪問靜態程序
13             System.out.println(a + b);
14         }
15     }
16 }
View Code


main方法中使用:

1 public static void main(String[] args) {
2     //創建靜態內部類
3     StaticInner.InnerClass innerClass = new StaticInner.InnerClass();
4     innerClass.execute();
5 }
View Code


2、成員內部類(member inner classes):

成員內部類可以訪問外部類的靜態與非靜態的方法和成員變量。

生成成員內部類對象的方法:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();

在局部內部類中訪問外部類的成員變量的方法:

OuterClass.this.a;

2.1、相關使用例子:

成員內部類:

 1 class MemberInner{
 2     private int a = 1;
 3 
 4     public void execute(){
 5         //在外部類中創建成員內部類
 6         InnerClass innerClass = this.new InnerClass();
 7     }
 8 
 9     /**
10  * 成員內部類
11  */
12     public class InnerClass{
13 
14         //內部類可以創建與外部類同名的成員變量
15         private int a = 2;
16 
17         public void execute(){
18             //this引用的是內部類
19             System.out.println(this.a);
20             //在內部了中使用外部類的成員變量的方法
21             System.out.println(MemberInner.this.a);
22         }
23     }
24 }
View Code


在main方法中使用:

1 public static void main(String[] args) {
2     //創建成員內部類
3     MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
4     innerClass.execute();
5 }
View Code


3、局部內部類(local inner classes):

類似於局部變量,不能定義為public,protected,private或者static類型。

定義方法中,只能方法中聲明為final類型的變量。

3.1、相關使用例子:

局部內部類:

 1 class LocalInner{
 2 
 3     public void execute(){
 4         final int a = 1;
 5         /**
 6  * 創建局部內部類
 7  */
 8         class InnerClass{
 9             public void execute(){
10                 System.out.println("LocalInner Class");
11 
12                 //局部內部類只能訪問final類型的變量
13                 System.out.println(a);
14             }
15         }
16         //只能在所在方法區域創建
17         new InnerClass().execute();
18     }
19 }
View Code


在main方法中使用:

1 public static void main(String[] args) {
2     //外部不能直接創建局部內部類
3     LocalInner localInner = new LocalInner();
4     localInner.execute();
5 }
View Code


4、匿名內部類(anonymous inner classes):

匿名內部類沒有類名,沒有class關鍵字也沒有extends和implements等關鍵字修飾。

匿名內部類會隱式地繼承一個父類或實現一個接口。

4.1、相關使用例子:

 1 public static void main(String[] args) {
 2     AnonymousInnerClassTest test = new AnonymousInnerClassTest();
 3 
 4     /**
 5  * 創建匿名內部類
 6  * 生成的類名:AnonymousInnerClassTest$1
 7  */
 8     test.print(new Date(){
 9         //重寫toString()方法
10         @Override
11         public String toString() {
12             return "Hello world.";
13         }
14     });
15 
16     JButton button = new JButton();
17 
18     /**
19  * 創建匿名內部類
20  * 該匿名內部類實現ActionListener接口
21  * 生成的類名:AnonymousInnerClassTest$1
22  */
23     button.addActionListener(new ActionListener(){
24         //實現接口中的方法
25         @Override
26         public void actionPerformed(ActionEvent e) {
27             System.out.println("使用匿名內部類實現ActionListener接口");
28         }
29     });
30 }
31 
32 public void print(Date date){
33     System.out.println(date);
34 }
View Code

 


免責聲明!

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



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