
class Insect...{
private int i = 9;
int j; 
Insect()...{
System.out.println("i=" + i + ",j=" + j);
j=37;
}
private static int x1 = print("static Insect.x1.initialized"); 
public static int print(String s)...{
System.out.println(s);
return 47;
}
} 

class Bettle extends Insect...{
private int k = print("Bettle.k initialized"); 
public Bettle()...{
System.out.println("k=" + k);
System.out.println("j=" + j);
}
private static int x2=print("static Insect.x2 initialized"); 
public static void main(String [] args) ...{
System.out.println("Bettle constructor");
Bettle b = new Bettle();
}
}运行结果:
static Insect.x1.initialized
static Insect.x2 initialized
Bettle constructor
i=9,j=0
Bettle.k initialized
k=47
j=37
解释:
Bettle运行需要先加载父类Insect,在加载Insect时先运行所有的Static代码,print()函数建立,但不运行.
这一句会运行:private static int x1 = print("static Insect.x1.initialized");
父类加载完成后加载子类Bettle,同样先初始化所有static代码,于是先运行:private static int x2=print("static Insect.x2 initialized");
然后进入main(),运行System.out.println("Bettle constructor");
再运行Bettle b=new Bettle();创建对象时先新建父类,此时先把所有变量设为初始值(i=9,j=0),然后触发父类constructor.
加载完父类再加载子类,同上先设定义值:private int k=print("Bettle.k initialized");然后运行构造函数
本文通过一个具体的Java示例程序,详细解析了Java类的加载过程及静态成员和实例成员的初始化顺序。从父类到子类,从静态变量到构造函数,逐步展示了Java程序执行的内部机制。
2002

被折叠的 条评论
为什么被折叠?



