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 */
// 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 */
运行的结果不一样了,好像不再“组合”了?书上写要把新类放在前面,可能就是这个道理。 这一句不明白,这个放前放后都是一样的呀,
* 运行的结果不一样了,好像不再“组合”了?书上写要把新类放在前面,可能就是这个道理。
*
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对象拥有不同的作用域,是不一样的,不会有任何冲突
// 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 一定要写在前面呢?