变量通过引用或值? Java的

时间:2011-07-31 10:53:01

标签: java sockets pass-by-reference

我有一个当前已连接的套接字。

Socket s; //Connected socket

如果我使用:

 Socket d = s;

socket d是否是相同的连接套接字?这取决于java是按值还是引用分配,在这种情况下我希望它通过引用分配。我不确定它究竟会做什么,所以我在这里问。

5 个答案:

答案 0 :(得分:6)

套接字d是否相同,连接套接字?是


Java对象中,在内存中名为“”的特殊区域中创建。 所以sd只是您创建的Socket对象的指针(或引用) 在堆区域。

enter image description here

答案 1 :(得分:5)

  

socket 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指向(引用)同一个对象时,自然地,只要该对象发生变化,您就可以通过d或{看到更改{1}}。 sd所做的就是告诉我们对象在哪里,他们根本不会包含对象。它们指向包含对象的内存。

一旦掌握了对象 references 就像s一样具有原语,并且具有完全相同的行为,理解Java代码会使 lot 更容易。

答案 2 :(得分:2)

假设s是对Socket的引用,d将是对Socket的引用的副本。

如果你做“d = null”,它不会影响s。

答案 3 :(得分:0)

初始化套接字d时

您正在创建一个试图指向对象的引用指针。

如果Socket s = socketobject(),s也是指向socketobject的引用指针。

所以如果你指定d = s,这意味着d的引用指针和s的引用指针相同,它也指向socket对象。

所以你的答案应该是肯定的

答案 4 :(得分:0)

Java引用与C++引用不同。在C++中,一旦创建了引用,就不能在以后引用另一个对象;它不能重新安置。在Java中可以是。

所以之后:

Socket d = s;

你可以让d(或s)指向其他Socket个对象,但即便如此,s(或d)仍会指向原始的Socket