Переменные по ссылке или по значению? Джава - PullRequest
1 голос
/ 31 июля 2011

У меня есть сокет, который в данный момент подключен.

Socket s; //Connected socket

Если я использую:

 Socket d = s;

Будет ли сокет d таким же, подключенный сокет?Это зависит от того, является ли Java назначением по значению или ссылке, в этом случае я бы хотел назначить его по ссылке.Я не уверен, что именно он собирается делать, поэтому я спрашиваю здесь.

Ответы [ 5 ]

6 голосов
/ 31 июля 2011

Будет ли сокет d таким же, подключенный сокет?Да


В Java объекты создаются в специальной области памяти, которая называется « Heap ».Так что s и d являются только указателями (или ссылками) для объекта Socket, созданного вами в области кучи.

enter image description here

5 голосов
/ 31 июля 2011

Будет ли розетка d такой же, подключенная розетка?

Да

Зависит от того, является ли Java назначением по значению или ссылке

Java - это полностью передача / назначение значение . Назначаемое здесь значение является ссылкой на объект. Думайте об этом как int, который говорит нам, в каком слоте памяти находится объект.

Продолжая аналогию int:

int a;
int b;

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

Какое значение b? 5 Конечно, последующее присвоение 6 для a не имеет ничего общего со значением, хранящимся в b.

И так же:

Socket d;
Socket s;

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

Какое значение s? Правильно! Это ссылка на подключенный объект сокета. Значение в s (ссылка на сокет) совершенно не зависит от назначения другого значения для d.

Теперь, конечно, когда d и s указывают (ссылаются) на один и тот же объект, естественно, каждый раз, когда этот объект изменяется, вы можете увидеть это изменение с помощью d или s. Все, что d и s делают, это говорят нам, где находится объект, они не содержат объекта вообще. Они указывают на память, которая содержит объект.

Как только вы поймете, что этот объект ссылки являются примитивами, такими же, как int s, и имеют точно такое же поведение, понимание кода Java упрощает lot .

2 голосов
/ 31 июля 2011

Скажем, s - это ссылка на Socket, d - копия ссылки на Socket.

Если вы введете "d = null", это не повлияет на s.

0 голосов
/ 31 июля 2011

Java ссылки отличаются от C++ ссылок.В C++, как только ссылка создана, она не может быть позже сделана для ссылки на другой объект;это не может быть повторно установлено.В Java это может быть.

Таким образом, после:

Socket d = s;

вы можете указать d (или s) на некоторый другой Socket объект, но даже тогда s (или d)) все равно будет указывать на оригинал Socket.

0 голосов
/ 31 июля 2011

при инициализации сокета d

вы создаете ссылочный указатель d, который пытается указать объект.

если Socket s = socketobject (), s также является указателем ссылки, указывающим на сокетобъект.

поэтому, если вы назначите d = s, что означает, что указатель ссылки на d такой же, как указатель ссылки s, который также указывает на объект сокета.

Таким образом, ваш ответ должен быть ДА

...