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】?
类初始化的顺序中,字段初始化和非静态变量初始化应该在构造函数前面执行的啊?!
不解!
麻烦哪位帮我解释一下!谢谢!
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】?
类初始化的顺序中,字段初始化和非静态变量初始化应该在构造函数前面执行的啊?!
不解!
麻烦哪位帮我解释一下!谢谢!
int l ,m;
print(l);
print(m);
这样都能打出来,太有才了!!!
public static void print(Object o) //看清参数
i是50(加载类的时候,在static块中被初始化)
l是0(加载类的时候,默认初始化为0)
执行new Test3(l);的时候m得到的是l的一个copy,也就是0
然后才去构造这个对象,之后不管你怎么改变l, m都不会改变
变量【l】是【L】的小写,不是【一】——我也觉得原题目的这点比较BT;并,不推荐使用l和o变量。
static print(Object)是我在自己写的静态方法,我喜欢在调试/test的时候加上这个方法,省去System.out.println()的繁琐。呵,为什么不能用Object做参数? 哈to szwx855:
我是先在eclipse中运行+调试+分析之后,没有结果,然后才发到这里来的!
不会有编译错误的。if hava,可能是l和1,O和0的错误吧,呵呵。to zephyr_cc() :
首先谢谢你!这样的答案才是我期望得到的回复。
but,在执行构造函数之前,不是先要执行字段的声明和非静态块的吗?!
在eclipse中调试的执行过程也证明了上面的说法是正确的!
且,答应出来的结果显示,l==20,m==0,j==70;
实际上,编译器会把
"字段的声明","非静态块"按顺序扔到一个方法中,然后再把构造函数体里面的内容扔到这个方法中
这个方法才是真正的初始化方法"字段的声明","非静态块"都是其一部分
然后才是去执行字段的声明和非静态块,执行构造函数等等。。