1.静态内部类
1 package innerclass; 2 /* 3 * 静态内部类 4 * 静态类只能访问外部类的静态成员变量或方法 5 * StaticInner.Inner inner = new StaticInner.Inner(); 6 */ 7 class StaticInner 8 { 9 private static int a = 4; 10 11 public static class Inner 12 { 13 public void test() 14 { 15 System.out.println(a); 16 } 17 } 18 } 19 20 public class StaticInnerClassTest 21 { 22 public static void main(String[] args) 23 { 24 //定义静态内部类的吗对象 25 StaticInner.Inner inner = new StaticInner.Inner(); 26 27 inner.test(); 28 } 29 }
2.成员内部类
1 package innerclass; 2 /* 3 * 成员内部类 4 * 可以访问一切的外部的成员变量和方法 5 * MemberInner.Inner2 inner = (new MemberInner()).new Inner2(); 6 */ 7 class MemberInner 8 { 9 private int a = 4; 10 11 public class Inner2 12 { 13 14 private int a = 5; 15 16 //访问外部类的成员变量 17 public void doSomething() 18 { 19 System.out.println(MemberInner.this.a); 20 } 21 22 //访问内部类的成员变量 23 public void doSomething1() 24 { 25 System.out.println(this.a); 26 System.out.println(a); 27 } 28 29 } 30 31 public void method() 32 { 33 //在外部类中创建内部类 34 MemberInner.Inner2 inner = this.new Inner2(); 35 Inner2 inner2 = this.new Inner2(); 36 } 37 } 38 39 public class MemberInnerClassTest 40 { 41 public static void main(String[] args) 42 { 43 //定义成员内部类对象 44 MemberInner.Inner2 inner = (new MemberInner()).new Inner2(); 45 46 inner.doSomething(); 47 } 48 }
3.局部内部类
1 package innerclass; 2 /* 3 * 局部内部类 4 * 不能用public,protected,private,static修饰 5 * 只能访问final修饰的局部变量 6 */ 7 class LocalInner 8 { 9 public void doSomething() 10 { 11 final int a = 4; 12 13 class Inner3 14 { 15 public void test() 16 { 17 System.out.println(a); 18 } 19 } 20 21 (new Inner3()).test(); 22 } 23 } 24 25 public class LocalInnerClassTest 26 { 27 public static void main(String[] args) 28 { 29 LocalInner localInner = new LocalInner(); 30 31 localInner.doSomething(); 32 33 } 34 }
4.匿名内部类
1 package innerclass; 2 /* 3 * 匿名内部类(局部内部类的一种形式) 4 * 没有名字的类 5 * 没有关键字class,extends,implements 6 * 没有构造方法 7 * 匿名内部类会隐式地继承一个父类或实现一个接口。 8 */ 9 import java.util.Date; 10 public class AnonymousInnerClassTest 11 { 12 @SuppressWarnings("deprecation") 13 public String get(Date date) 14 { 15 return date.toLocaleString(); 16 } 17 18 public static void main(String[] args) 19 { 20 AnonymousInnerClassTest test = new AnonymousInnerClassTest(); 21 22 //String str = test.get(new Date());; 23 //System.out.println(str); 24 25 //定义一个匿名内部类,它继承了Date类(或者实现某一个接口) 26 String str = test.get(new Date() 27 { 28 //重写Date类的toLocaleString()方法 29 public String toLocaleString() 30 { 31 return "hello world"; 32 } 33 }); 34 System.out.println(str); 35 } 36 }