public class Person {  
      
        public Person(int id) {  
            System.out.println("person(" + id + ")");  
        }  
      
        public static void main(String[] args) {  
            Build b = new Build();  
        }  
    }  
      
    class Build {  
        Person p1 = new Person(1);  
      
        public Build() {  
            System.out.println("this is build's block!");  
            Person p2 = new Person(2);  
        }  
      
        Person p3 = new Person(3);  
      
    }  为什么输出的是这个?
person(1)
person(3)
this is build's block!
person(2)main方法 第一句是 Build b = new Build();  
应该先执行 Build的无参构造方法啊

解决方案 »

  1.   


    这个不是成员变量啊, 是new出来的对象啊, 
      

  2.   

    请看下这篇文章http://www.cnblogs.com/lmtoo/archive/2012/04/08/2437918.html
    第一段是讲类变量的。
    第二段将成员变量的。
    看了上面这篇文章后,你就大致明白了。
    你的代码在编译后会被JVM调整一下顺序。大致会优化成这个样子。    public class Person {  
          
            public Person(int id) {  
                System.out.println("person(" + id + ")");  
            }  
          
            public static void main(String[] args) {  
                Build b = new Build();  
            }  
        }  
          
        class Build {  
            Person p1 = null;  
    Person p3 = null;         public Build() {  
    p1 = new Person(1);
    p3 = new Person(3);
                System.out.println("this is build's block!");  
                Person p2 = new Person(2);  
            }  
     
          
        }对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。
    所以就出来你这样的结果
      

  3.   


    的的确确 先执行main方法 第一句是 Build b = new Build();  
    但是 在new Build()会加载类Build的时候 会先执行 静态代码块和代码块,在执行相关方法。
      

  4.   

    java 初始化顺序
    父类--静态变量
    父类--静态初始化块
    子类--静态变量
    子类--静态初始化块
    父类--变量
    父类--初始化块
    父类--构造器
    子类--变量
    子类--初始化块
    子类--构造器
      

  5.   

    请问父类--静态初始化块和父类--初始化块有什么区别,是不是向static{}这样的称作静态初始化块,初始化块又是什么样的呢?