代码执行顺序:
程序加载class文件,加载了这个public class StaticIni 类后,立刻进行静态代码块的部分
static MyPackage t2 = new MyPackage();
static MyRoom t3 = new MyRoom();
先读 static MyPackage t2 = new MyPackage();
加载 MyPackage 这个类,同样的先执行静态代码块一:static MyBook b1 = new MyBook(1); 二:static MyBook b2 = new MyBook
(2);
对一:同样的加载MyBook 这个类,先执行静态代码块,这MyBook 类中没有静态代码块,因此进行实例对象初始化,执行
MyBook(int maker){ System.out.println("MyBook("+maker+")"); }这句,打印出MyBook(1);
对二:因为在一中已经给类MyBook 加载了,因此二的代码直接进行实例对象初始化,打印出MyBook(2)
现在,到了对MyPackage 这个类进行实例对象初始化了,相应的打印出MyPackage(),再执行里面构造函数的下一条语句b2.foo(1);
相应的去调用这个方法,执行MyBook类中的void foo(int maker){System.out.println("foo("+maker+")"); },打印出foo(1);
到此,执行完static MyPackage t2 = new MyPackage(); 后,接桌执行tatic MyRoom t3 = new MyRoom()
先加载MyRoom 这个类,成员变量默认初始化,即MyBook b3=null,然后静态代码的执行 一 :static MyBook b4 = new MyBook(4);
二: static MyBook b5 = new MyBook(5);
对一:因为在上面已经给这个类加载了,同理的直接进行实例对象初始化,打印出MyBook(4)
对二:和上面的一 一样,打印出MyBook(5)
现在,来到了对new MyRoom()实例对象初始化,相应的执行构造函数的语句MyRoom(){ System.out.println("MyRoom()"); b4.foo
(2); },先打印出MyRoom(),再执行里面构造函数的下一条语句b4.foo(2),打印出foo(2)
好了,到此,进入主函数main()里面了,先执行System.out.println("Creating new MyRoom() in main"); ,打印出
Creating new MyRoom() in main
然后执行new MyRoom();
这个类MyRoom已经加载了,因此只执行实例对象初始化,先显示成元变量MyBook b3,即b3=new MyBook (),那这样就要访问了MyBook
这个类,这个类已经加载了,因此只执行实例对象初始化,即执行MyBook(int maker){System.out.println("MyBook("+maker+")");
},打印出Mybook(3) .再执行new MyRoom()对应的构造函数语句,得到打印出MyRoom(),调用b4.foo(2)语句时,得到打印出foo(2)
继续,执行System.out.println("Creating new MyRoom() in main"); 打印出Creating new MyRoom() in main
继续执行下面的new MyRoom();
这和上面的一样,得到打印的结果: MyBook(3) MyRoom() foo(2)
最后执行 t2.foo2(1); t3.foo3(1); 这两句
得到打印结果foo2(1)和foo3(1)
|