Java代码
public class OuterClass{
class InnerClass{
private static int i;
}
}
public class OuterClass{
class InnerClass{
private static int i;
}
} 对于java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化,
那么必须先执行加载OuterClass,再加载Innerclass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
Verion 0.11:
对于红色标记的部分,当时理解上有误,我们知道InnerClass可以有静态常量(static final),那么InnerClass类加载一定在OuterClass对象创建之前完成,但这还不足以说明为什么非静态内部类里面不能有静态的变量(基本类型 或对象因用),这里面涉及到Java语言的定义以及JVM的类加载的原理方面的知识,我将进一步研究这个问题,技术是严谨的,也希望各位读者提出宝贵的意见。
|