class Window{
Window(int er){
System.out.println("Window("+er+")");
}
}
class House{

Window w1=new Window(1);
   
House(){
System.out.println("House()");
w3=new Window(33);
}
 Window w2=new Window(2);
 void f(){
 System.out.println("f()");
 }
 Window w3=new Window(3);
}public class OrderOfInitialization { public static void main(String[] args) {
// TODO Auto-generated method stub
    House h=new House();
    h.f();
}}

解决方案 »

  1.   


    class Window{
    Window(int er){
    System.out.println("Window("+er+")");
    }
    }
    class House{Window w1=new Window(1);//第三
        
    House(){//第六
    System.out.println("House()");
    w3=new Window(33);//第七
    }
    Window w2=new Window(2);//第四,你将它放在构造方法后面也没有办法,这是按顺序的。
    void f(){
    System.out.println("f()");
    }
    Window w3=new Window(3);//第五,你将它放在其它方法后面也没有办法,这是按顺序的。
    }public class OrderOfInitialization {public static void main(String[] args) {//第一
    // TODO Auto-generated method stub
      House h=new House();//第二
      h.f();//第八
    }
    }
      

  2.   

    这里所考虑的应该是new类对象时类的加载情况,在执行House h=new House() 时,首先,JVM要加载House这个类,过程:
       1,为类属性分配空间
       2,给属性赋默认值
       2,递归调用父类构造器并初始化父类属性
       3,初始化本类属性
       4,执行本类构造器中的语句
    然后,为对象创建一个对象引用
    楼主可以结合楼上所给答案,再细细体味一下。
      

  3.   

    在初始化house的时候,JVM要先将house类声明的对象按顺序进行初始化。但是无论变量在类中的什么位置,都要在构造方法前完成,所以直接跳到第4步