public class OuterTest{ class InnerTest{ public static int i; } }
如上写法会报错,原因是:如果非静态内部类中定义了静态成员i,要实现i 变量的初始化过程,就应该是先执行外部类的加载再实现内部类的加载,而内部类是非静态的,内部类的初始化必须是在外部类创建对象之后进行的,但是静态变量的加载又必须在对象创建之前完成,这样就出现了矛盾;
public class OuterTest{ class InnerTest{ public static final int i = 5; } }
但如果给静态成员变量加上修饰符final,就不会报错,因为这时i相当于就是一个常量,java中的常量是存放在常量池的,加载常量不需要加载类,不会产生矛盾;