※ 引述《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)