今天读了thinking in java 中关于内部类部分,书上说了普通内部类中不能使用静态的字段或者方法,但书上并没有说的很清楚。细究一番,原来是类加载做的怪。
Java在第一次使用类的时候需要进行类加载。
什么叫第一次使用类,即使用类中的静态资源(静态属性或者静态方法)注:构造器也可以看作是静态方法。
使用new创建对象:
如果该对象时继承自父类(当然Object是所有类的父类),那就先加载父类,在父类中首先找到静态资源并对其进行初始化,初始化完成后,随后执行子类中静态资源的初始化,直到所有静态资源执行完成后才开始分配内存空间,然后清零(这时候基本数据为0,引用为null,注意还没有执行初始化),接着从父类开始进行成员的初始化,(将所有字面量赋值给成员变量)等到初始化完成后,然后执行父类的构造器,然后依次是子类。。。访问类中的静态成员或静态方法:
这里有两种可能,如果是<b>静态常量的基本数据类型</b>,那么类加载器不会加载该类,这是因为这种数据可以在编译时直接确定。除开这种情况外,如果该类有父类,那么先执行父类的静态成员初始化,接着执行该类的静态资源初始化。
综上所述
类对象在被创建(分配内存)之前就静态资源就已经被初始化完成了,假设内部类中允许存在静态资源,那么类加载器就回去加载它,既然是内部类,你得先加载外部类吧,加载外部类的时候需要先进行静态变量的初始化操作,这里包括内部类,所以这里就产生了矛盾,内部类的初始化需要依赖外部类的引用,所以编译器不支持内部类的静态域或者方法(注:静态方法只有在首次调用才会进行初始化)