- class Demo
- {
- static Demo d=new Demo(); //《1》
- Demo()
- {}
- }
- class Test
- {
- public static void main(String[]args)
- {
- Demo a=new Demo(); //《2》
- }
- }
-
- //-------------------------------程序二----------------------------------------
-
- class Demo
- {
- Demo d=new Demo(); //《3》
- Demo()
- {
- }
- }
- class Test
- { public static void main(String[] args)
- {
- Demo a=new Demo(); //《4》
- }
- }
复制代码 程序一中,运行class Test我认为是这样执行的:
1,读到《2》时,先把Demo类加载进内存
2,这时运行《1》,创建一个Demo类的对象
3,然后创建的对象的地址赋值给d,d存放在方法区,这时内存加载完成
4,程序又回到《2》,创建第二个Demo类的对象
5,把第二个Demo对象的地址赋值给a,a在栈内存中
请问以上步骤我理解的是否正确,是否有少了什么步骤?
程序二中,
1,运行到《4》时加载Demo类进内存
2,当运行到《3》时,创建Demo类的对象,因为d不是静态的,放在堆内存,所以这里貌似陷入了一种创建对象和加载类的循环,但我搞不明白这个循环的步骤是怎么样的。谁能详细告知。还有这个对象(《3》代码建立的对象)到底建立起来了没有??
为什么程序2编译可以通过呢?
|