2011-07-31 73 views
1

我有一個當前連接的插座。通過引用或值的變量? Java

Socket s; //Connected socket 

如果我使用:

Socket d = s; 

將插座d是相同的,連接插座?它取決於java是通過值還是引用賦值,在這種情況下,我希望它通過引用來分配。我不確定它究竟會做什麼,所以我在這裏問。

回答

5

套接字d是相同的,連接套接字?

這取決於如果Java通過值或參考分配

Java是完全通過噪聲/分配-由。此處分配的值是對該對象的引用。把它看成是一個int,它告訴我們的目標是在哪一個插槽內存

繼續在int比喻:

int a; 
int b; 

a = 5; 
b = a; 
a = 6; 

什麼b的價值? 5,當然6a的後續賦值與存儲在b中的值無關。

所以類似:

Socket d; 
Socket s; 

d = /* ... create and connect a socket... */; 
s = d; 
d = null; 

什麼的s價值?對!這是對連接的套接字對象的引用。 s(對套接字的引用)中的值完全不受您爲d指定不同值的影響。

現在,當然,當ds指向(指)相同的對象,自然是對象更改任何時候,你可以看到通過ds的變化。所有那ds做的是告訴我們對象在哪裏,他們不包含包含的對象。他們指向包含對象的內存。

一旦你掌握那個對象引用是原語就像int S和具有完全相同的行爲,理解Java代碼中得到了很多容易

+1

其他答案也很好。謝謝大家的幫助 :) – David

6

套接字d是否是相同的連接套接字?是


Java對象在被稱爲「」記憶的特殊區域中創建。 因此sd只是您在堆區域創建的 套接字對象的指針(或引用)。

enter image description here

+0

我會爲圖解得出這個答案,除非...我早就已經爲它的文本清晰簡單地提出了它。 ;-) –

2

假設s是一個套接字的引用,d將是參考插座的副本。

如果你做「d = null」,它不會影響s。

+0

如果你做s = null,會影響d嗎? – David

+0

不,這兩個都是對同一對象的引用副本,沒有一個原始副本。 – Tristan

0

在初始化插槽d

要創建這些努力指向一個對象的引用指針d。

如果Socket s = socketobject(),s也是指向套接字對象的引用指針。

所以如果你指定d = s,這意味着d的引用指針與s的引用指針相同,它也指向socket對象。

所以你的答案應該是肯定

0

Java引用來自C++引用不同。在C++中,一旦創建了引用,就不能再引用另一個對象;它不能被重新安裝。在Java它可以。

所以經過:

Socket d = s; 

可以使d(或多個)指向一些其他Socket對象,但即使如此,S(或d)仍然指向原始Socket