1,首先解释几个概念:
1)内部类---顾名思义,内部类就是在一个类(外部类)的内部再定义一个类(内部类),这个内部类作为外部类的一个成员存在,也就是说内部类可随意访问外部类的成员数据和成员方法。
package cb;
public class Out//外部类
{
private int a=1;//外部类的一个数据成员
class Inner//内部类
{
public void test()
{
int b=2*a;//此处调用外部类的成员
System.out.println(b);
}
}
}//这就是内部类的一个基本的认识
2)关键字static---:static意为静态的意思,当static修饰类的成员(数据成员和成员方法)时,该成员属于整个类,即所有该类的对象都有该属性,调用的时候不必创建对象直接用类名调用即可。
3)类的加载---:对于一段代码,它们在java虚拟机中的加载(分配内存)顺序是不一样的,java虚拟机的要求是:所有的静态变量必须在所有的非静态变量之前加载;对于内部非静态类,先加载外部类后加载内部类。
2,有了以上知识的铺垫,这个问题就很容易理解了:首先内部类作为外部类的一个非静态成员,它的加载必须有外部类的对象实例(此时非静态成员已经加载),而当你加载该对象实例的时候,内部类里的静态成员并未被加载,这就违背了“所有的静态变量必须在所有的非静态变量之前加载”这一原则,所以这本身就是一个矛盾。而如果内部类是静态的话,就不会存在该矛盾了,因为访问Class Inner 是不需要Class Outer的实例的。