一、
内部类(nested classes),面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。内部类的表现形式包括:静态内部类、成员内部类 、局部内部类、匿名内部类。
静态内部类指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)
一个 静态内部类去掉static 就是成员内部类,可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法。
1 public class Outer { 2 private static int i = 1; 3 private int j = 10; 4 public static void outer_f1() { } 5 6 7 public void outer_f2() { } 8 9 10 // 静态内部类可以用public,protected,private修饰 11 // 静态内部类中可以定义静态或者非静态的成员 12 static class Inner { 13 static int inner_i = 100; 14 int inner_j = 200; 15 static void inner_f1() { 16 //静态内部类只能访问外部类的静态成员(包括静态变量和静态方法) 17 System.out.println("Outer.i" + i); 18 outer_f1(); 19 } 20 21 22 void inner_f2() { 23 // 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法) 24 // System.out.println("Outer.i"+j); 25 // outer_f2(); 26 } 27 } 28 29 30 public void outer_f3() { 31 // 外部类访问内部类的静态成员:内部类.静态成员 32 System.out.println(Inner.inner_i); 33 Inner.inner_f1(); 34 // 外部类访问内部类的非静态成员:实例化内部类即可 35 Inner inner = new Inner(); 36 inner.inner_f2(); 37 } 38 39 40 public static void main(String[] args) { 41 new Outer().outer_f3(); 42 } 43 }

二、 作用
1)实现了更好的封装,我们知道,普通类(非内部类)的访问修饰符不能为private或protected,而内部类可以。当我们将内部类声明为private时,只有外部类可以访问内部类,很好地隐藏了内部类。
2)内部类可以继承(extends)或实现(implements)其他的类或接口,而不受外部类的影响。
3)内部类可以直接访问外部类的字段和方法,即使是用private修饰的,相反的,外部类不能直接访问内部类的成员。