Java类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类被称为内部类。根据定义的方法不同,内部类可以分为静态内部类、成员内部类、局部内部类、匿名内部类四种。
静态内部类
 定义在类内部的静态类就是静态内部类。
package innerclass;
//定义一个静态内部类
public class Out1 {
	private static int a;
	private int b;
	public static class Inner{
		public void print(){
			System.out.println(a);
			System.out.println("这是一个静态内部类");
		}
	}
}
注意
 ①静态内部类可以访问外部类所有的静态变量和方法,即使是private。
 ②静态内部类和一般类一致,都可以定义静态变量和方法和构造方法。
 ③其他类要使用静态内部类的方法要通过Java语法“外部类.内部类.方法名()”的方法
 例如:
 Out1.Inner inner = new Out1.Inner();
 inner.print();
输出:
 
 ④Java集合HashMap内部就有一个静态内部类Entry,Entry是HashMap存放元素的抽象,HashMap内部维护Entry用数组存放元素,但是Entry对于用户是透明的。像这种和外部类关系密切,并且不依赖外部类实例的,都可以使用静态内部类。
成员内部类
 定义在类内部的普通类
package innerclass;
//定义一个成员内部类
public class Out2 {
	private static int a;
	private int b;
	
	public class Inner{
		public void print() {
		    System.out.println(a);
			System.out.println(b);
			System.out.println("这是一个成员内部类");
		}
		
	}
}
①在成员内部类中不可以定义静态变量和方法(final修饰的除外),原因是类的加载机制中是先加载静态成分的,如果在成员内部类中加入静态变量和方法,就会导致加载顺序的歧义。
 ②外部类的所有实例成员都对内部类可见。成员内部类的实例对象有外部类的实例对象的引用,所以可以访问到外部类的所有静态成员(包括私有的)。
 ③外部类对内部类可见,所以可以在内部类中创建外部类的实例对象。
 ④内部类对外部类可见。因为编译后的内部类至少是包内的,所以在外部类中可以new生成内部类的实例对象。
 外部类按照常规的类访问方式使用内部类,唯一的差别是外部类可以访问成员内部类的所有方法和属性,包括私有的属性和方法。
 ⑤成员内部类可以用public、protected、private访问修饰符进行访问控制,内部类能够隐藏起来,不为同一包内的其他类访问。成员内部类一般当做成员变量设置为private。
 ⑥成员内部类是非静态的。所以在成员内部类中,不能定义静态字段、静态方法和静态内部类,因为成员内部类需要先创建外部类的实例对象,才能创建自己的实例对象;但是可以定义非静态字段、非静态方法和非静态内部类。(除了final)
 成员内部类为什么不能不能定义静态变量?
 定义静态变量是要占用内存的,在编译时只要是定义为静态变量了,系统就会自动为其分配内存给他,而内部类是在外部类编译完成后才进行编译的,也就是说,必须有外部类存在后才能有内部类,这就和编译时就为静态变量分配内存产生冲突,因为系统执行:**运行外部类——静态变量内存分配——内部类,而此时成员内部类中如果有静态变量,就会冲突,所以不能定义静态变量。

 京公网安备 11010502036488号
京公网安备 11010502036488号