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】?
类初始化的顺序中,字段初始化和非静态变量初始化应该在构造函数前面执行的啊?!
不解!
麻烦哪位帮我解释一下!谢谢!

解决方案 »

  1.   

    不要嫌变量的初始化顺序BT,题目本来就是那个BTer这么出的,呵...
      

  2.   

    这程序太变态了!
    int l ,m;
    print(l);
    print(m);
    这样都能打出来,太有才了!!!
    public static void print(Object o) //看清参数
      

  3.   

    太NB了。我在eclipse中测试了下,结果语法错的太多了~这也能出结果 ?
      

  4.   

    new Test3(l);之前
    i是50(加载类的时候,在static块中被初始化)
    l是0(加载类的时候,默认初始化为0)
    执行new Test3(l);的时候m得到的是l的一个copy,也就是0
    然后才去构造这个对象,之后不管你怎么改变l, m都不会改变
      

  5.   

    to  sea_force() :
    变量【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;
      

  6.   

    "but,在执行构造函数之前,不是先要执行字段的声明和非静态块的吗?!"是在执行"构造函数体里面的内容"之前才先要执行"字段的声明"和"非静态块"
    实际上,编译器会把
    "字段的声明","非静态块"按顺序扔到一个方法中,然后再把构造函数体里面的内容扔到这个方法中
    这个方法才是真正的初始化方法"字段的声明","非静态块"都是其一部分
      

  7.   

    在类加载的时候,l是0吧,你new Test3(l);的时候,在去构造这个类实例之前就把l的值取出来了,是0,
    然后才是去执行字段的声明和非静态块,执行构造函数等等。。