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)
{
 House h=new House();
 h.f();
}
}
没错!是《thinking in java》的例子~
小弟不明了 调用h.f()的时候最先打印出的不是f() 最后输出结果不懂 我不太明白

解决方案 »

  1.   

    输出结果
    window(1)
    window(2)
    window(3)
    House()
    window(33)
    f()帮你分析下为什么会是这样的输出结果. main里面是实例的House对象, 加载类的时候,先初始化静态成员,由于没有静态成员,所以这步跳过! 创建对象的时候,首先初始化成员字段,然后执行构造方法,
    House类里面的成员字段的顺序的window(1),window(2),window(3)所以会先输出这三个,然后调用构造方法,输出House(),构造函数里面会执行w3=new Window(33); 所以会输出window(33)。实例完了以后,h.f()就会输出f(). 步骤就是这样.希望对LZ有所帮助
      

  2.   

    建议楼主认真看一下Think in java这本书类的初始化说得很清楚。
      

  3.   

    new  对象名   或是调用      类 . 属性/方法     时都会进行类加载
    类加载时处理static修饰的属性、方法、静态代码块
    类加载完成后,执行 new 对象名,它分成4步
        1,为对象分配内存空间
        2,为属性赋默认值(引用类型为 null,基本类型为 0/0.0,char为\u0000,boolean为false)
        3,为属性赋显示值 (就是“=”后面的值)
        4,调用构造方法        
    所以对于你的问题:
       Window w1 = new Window(1);
    Window w2 = new Window(2);
    Window w3 = new Window(3);
    都是House类的属性,当new House()会执行类加载,类加载完成后,执行上面的4步,它们三个会首先依次执行,结果依次输出    
            window(1)
            window(2)
            window(3) 
    再去调用House()构造方法   输出   
            House()
    最后执行   w3 = new Window(33);    给引用w3重新赋对象,输出 
            window(33)
    House h = new House(); 到此结束
    再去执行  h.f();   输出
            f()
      

  4.   

    楼主我教你怎么贴代码:
    1、将代码进行良好的格式化,以方便阅读。
    2、在发帖文本框的上方单击“#”按钮,选择 Java
    3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:public class Hello {    // 程序入口
        public static void main(String[] args) {
            System.out.println("Hello!");
        }
    }
      

  5.   

    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) 

    House h=new House(); 
    h.f();