一个类初始化顺序的小问题
public class Test3 {
public static void main(String[] args) {
Test3 t = new Test3(l);
}//main
static int i = 5;
static int l;
int j = 7;
int k ;
public Test3(int m) {
print(l);
print(m);
print(i+ " "+j+ " "+k+ " "+m);
}
{
j = 70; l = 20;
}
static {
i = 50;
}
public static void print(Object o) {
System.out.println(o);
}//print
}// Test3
===================
为什么上面的print(m)答应的是【0】而不是【20】?
类初始化的顺序中,字段初始化和非静态变量初始化应该在构造函数前面执行的啊?!
不解!
麻烦哪位帮我解释一下!谢谢!
------解决方案-------------------- "but,在执行构造函数之前,不是先要执行字段的声明和非静态块的吗?! "
是在执行 "构造函数体里面的内容 "之前才先要执行 "字段的声明 "和 "非静态块 "
实际上,编译器会把
"字段的声明 ", "非静态块 "按顺序扔到一个方法中,然后再把构造函数体里面的内容扔到这个方法中
这个方法才是真正的初始化方法
"字段的声明 ", "非静态块 "都是其一部分
------解决方案--------------------在类加载的时候,l是0吧,你new Test3(l);的时候,在去构造这个类实例之前就把l的值取出来了,是0,
然后才是去执行字段的声明和非静态块,执行构造函数等等。。