精華區beta java 關於我們 聯絡資訊
※ 引述《Oreilly (怕寂寞卻愛自由)》之銘言: : MyClass my =new MyClass(){} : 有沒有人可以證明 : 在單一執行緒下 : 會先執行建構子 初始化物件 : 才assign給變數my : 疑惑中... 先用 primitive type 做個簡單的說明 int a = 5; 事實上這也可以拆成兩段來看 前半段 int a 將從記憶體中劃出 4-byte 的空間並與 a 繫結 後半段則將 5 以 value 的形式儲存在 a 所繫結的記憶體當中。 所以很明顯的,兩者的先後關係是必然的。 至於物件其實也是一樣, 前半段 MyClass my 是規劃一個 Reference 並與 my 繫結 後半段則是將 MyClass 實體化後, assign 其 hashCode (或著說記憶體位置) 給 my 所繫結的記憶體位址。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.67.51 > -------------------------------------------------------------------------- < 作者: Oreilly (怕寂寞卻愛自由) 看板: java 標題: Re: [問題] 請教物件生成的流程 時間: Sun Mar 5 12:19:43 2006 MyClass my=new MyClass(); 這行code做了以下事情 step1.宣告 MyClass型態的變數my step2.在heap上建立MyClass 物件 step3.執行MyClass的建構子 step4.把記憶體的位置 asign reference給變數my ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 可是這篇文章 http://www-128.ibm.com/developerworks/java/library/j-dcl.html Listing 6. Assembly code produced from code in Listing 5 ;asm code generated for getInstance 054D20B0 mov eax,[049388C8] ;load instance ref 054D20B5 test eax,eax ;test for null 054D20B7 jne 054D20D7 054D20B9 mov eax,14C0988h 054D20BE call 503EF8F0 ;allocate memory 054D20C3 mov [049388C8],eax ;store pointer in ;instance ref. instance ;non-null and ctor ;has not run 054D20C8 mov ecx,dword ptr [eax] 054D20CA mov dword ptr [ecx],1 ;inline ctor - inUse=true; 054D20D0 mov dword ptr [ecx+4],5 ;inline ctor - val=5; 054D20D7 mov ebx,dword ptr ds:[49388C8h] 054D20DD jmp 054D20B0 這篇文章推論出 step3和step4順序應該倒過來 這在多執行緒的情況下是合理的 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 所以小弟我只想知道單一執行緒底下且不考慮繼承 有沒有人能證明物件生成的流程 感謝ing... -- dd -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.221.67.175 > -------------------------------------------------------------------------- < 作者: tkcn (小安) 看板: java 標題: Re: [問題] 請教物件生成的流程 時間: Sun Mar 5 12:47:59 2006 ※ 引述《Oreilly (怕寂寞卻愛自由)》之銘言: : MyClass my=new MyClass(); : 這行code做了以下事情 : step1.宣告 MyClass型態的變數my : step2.在heap上建立MyClass 物件 : step3.執行MyClass的建構子 : step4.把記憶體的位置 asign reference給變數my : ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ : 可是這篇文章 : http://www-128.ibm.com/developerworks/java/library/j-dcl.html : Listing 6. Assembly code produced from code in Listing 5 請注意看最後一段 "Not all JIT compilers generate the code as above." --- public class Test { static Test a; public Test(){ try{ Thread.sleep(3000); }catch(InterruptedException e){} System.out.println("Constructor finish!!"); } public static void main (String [] args){ Thread t = new Thread(new Runnable(){ public void run(){ for(int i=0;i<10;i++){ System.out.println(a); try{ Thread.sleep(500); }catch(InterruptedException e){} } } }); t.start(); a=new Test(); } } --- 執行結果: null null null null null null null Constructor finish!! Test@757aef Test@757aef Test@757aef -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.67.94 > -------------------------------------------------------------------------- < 作者: tkcn (小安) 站內: java 標題: Re: [問題] 請教物件生成的流程 時間: Sun Mar 5 13:02:27 2006 [Local] 前面例子寫的好像複雜了點 Orz 其實這樣就可以證明了 --- public class Test { static Test a; public Test(){ System.out.println(a); } public static void main (String [] args){ System.out.println(a); a=new Test(); System.out.println(a); } } --- 結果: null null Test@35ce36 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.131.67.94 ※ 編輯: tkcn 來自: 220.131.67.94 (03/05 13:02)