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 }
main方法中使用:

1 public static void main(String[] args) { 2 //創建靜態內部類 3 StaticInner.InnerClass innerClass = new StaticInner.InnerClass(); 4 innerClass.execute(); 5 }
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 }
在main方法中使用:

1 public static void main(String[] args) { 2 //創建成員內部類 3 MemberInner.InnerClass innerClass = new MemberInner().new InnerClass(); 4 innerClass.execute(); 5 }
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 }
在main方法中使用:

1 public static void main(String[] args) { 2 //外部不能直接創建局部內部類 3 LocalInner localInner = new LocalInner(); 4 localInner.execute(); 5 }
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 }