package testOrder;public class ObjectCreation {
   // TestClass testClass1=new TestClass("fieldValue");//组合,3
static TestClass testClass2=new TestClass("staticValue");//1
 //TestClass testClass3=new TestClass("*****filedValue*******");

static { //2
testClass2.makeInner();
} public ObjectCreation(){  
System.out.println("ObjectCreation init");
}

public ObjectCreation(String name){
System.out.println("ObjectCreation   "+ name +"  init");
}

public static void main(String [] args){
ObjectCreation objectCreation=new ObjectCreation("object1");//4,要3先
ObjectCreation objectCreation2=new ObjectCreation("object2"); // 5,要3先,组合知识?
TestClass testClass1=new TestClass("filedValue");//组合,
}

}class TestClass{
public TestClass(String name){
System.out.println("TestClass   "+ name+  "  init  ");
}

void makeInner(){
System.out.println("makeInner( ) invoked");
}
}
/*程序分析,程序检查main(),没有static,检查创建了两个ObjectCration对象,然后转向main()外
 * 在初始化两个ObjectCretiong对象之前最先初始化static,所以程序最先打印出TestClass static init
 * 和makeInner() invoked,然后转向ObjectCreation 类的对象objecCration,因为程序用到了新类组合
 * TestClass,它创建了两个对象,一个非静态的testClass1,和一个静态的testClass2.TestClass类的
 * 对象在ObjectCration 之前创建,那么ObjectCration 的两个对象每次都会先执行testClass1的构造函数,tesClass2
 * 不再执行(静态代码只执行一次),因此接下来先打印出TestClass fieldValue init,然后是CreationObject
 *  object1 init. 同样执行objectCration2,先执行testClas1的构造函数,然后objectCration2的构造
 *  函数。接下来打印出:TestClass filedVaule init,ObjectCretion object2 init.
 *  
    TestClass   staticValue  init  
    makeInner( ) invoked
    TestClass   fieldValue  init  
    ObjectCreation   object1  init
    TestClass   fieldValue  init  
    ObjectCreation   object2  init *  
 * 
 * 
 * 当把TestClass testClass1=new TestClass("fieldValue"); 放在objectCreation2下一行的时候
 * 运行的结果不一样了,好像不再“组合”了?书上写要把新类放在前面,可能就是这个道理。
 * 
   TestClass   staticValue  init  
   makeInner( ) invoked
   ObjectCreation   object1  init
   ObjectCreation   object2  init
   TestClass   filedValue  init   */

解决方案 »

  1.   

     忘了修改了,//TestClass testClass1=new TestClass("fieldValue");把注释取消,然后把ObjectCreation2 下面的一行TestClass testClass1=new TestClass("fieldValue");加上注释,
      

  2.   

    当把TestClass testClass1=new TestClass("fieldValue"); 放在objectCreation2下一行的时候 
    运行的结果不一样了,好像不再“组合”了?书上写要把新类放在前面,可能就是这个道理。 这一句不明白,这个放前放后都是一样的呀,
      

  3.   

    * 当把TestClass testClass1=new TestClass("fieldValue"); 放在objectCreation2下一行的时候 
    * 运行的结果不一样了,好像不再“组合”了?书上写要把新类放在前面,可能就是这个道理。 

      TestClass  staticValue  init  
      makeInner( ) invoked 
      ObjectCreation  object1  init 
      ObjectCreation  object2  init 
      TestClass  filedValue  init  */ 
    前面部分理解很正确,但这部分感觉理解错误,而且我自己运行了,输出是下面这个样子TestClass  staticValue  init  
    makeInner( ) invoked
    TestClass  fieldValue  init  
    ObjectCreation  object1  init
    TestClass  fieldValue  init  
    ObjectCreation  object2  init
    TestClass  filedValue main方法里的testClass1和类中testClass1对象拥有不同的作用域,是不一样的,不会有任何冲突
      

  4.   

     public class ObjectCreation {
      // TestClass testClass1=new TestClass("fieldValue");//组合,3 static TestClass testClass2=new TestClass("staticValue");//1
     //TestClass testClass3=new TestClass("*****filedValue*******");

    static { //2
    testClass2.makeInner();
    } public ObjectCreation(){  
    System.out.println("ObjectCreation init");
    }

    public ObjectCreation(String name){
    System.out.println("ObjectCreation   "+ name +"  init");
    }

    public static void main(String [] args){
    ObjectCreation objectCreation=new ObjectCreation("object1");//4,要3先
    ObjectCreation objectCreation2=new ObjectCreation("object2"); // 5,要3先,组合知识?
    TestClass testClass1=new TestClass("filedValue");//组合, }

    }class TestClass{
    public TestClass(String name){
    System.out.println("TestClass   "+ name+  "  init  ");
    }

    void makeInner(){
    System.out.println("makeInner( ) invoked");
    }
    } 看两个红色的。两个互换,运行结果不一样?是不是TestClass 一定要写在前面呢?
      

  5.   

    你把testClass1放到构造objectCreation2后面构造,已经不是组合了,因为这个testClass1已经不属于ObjectCreation类的作用范围了,你也应该知道组合是要作为类的变量而存在的,现在只是一个局域变量而已。不过,我不是很理解你这里的规则3,"3.紧靠在要求实际使用对象之前,这样做可以减少不必要的开销。假如对象并不需要创建的话。",我也没见过这样的规则