2013-05-13 2 views
2

В этом примереПравильный способ мышления о первобытном назначении

int x = 5; 
int y = x; 
x = 4; 

у останется 5, поскольку х просто переподчиняемый и не манипулируя объект он используется для обозначения в любом случае. Мой вопрос в том, что я только что сказал о правильном способе думать об этом? Или существует дублирование памяти, хранящейся в «x», и дублирование помещается в «y».

+1

данные, хранящемся в й копируются у – Breavyn

ответ

8

Примитивы, в отличие от объектов, хранятся непосредственно внутри переменной. То есть переменная примитивного типа не хранит ссылку на примитив, она сохраняет значение примитива напрямую.

Когда одна примитивная переменная назначается другой примитивной переменной, она копирует значение.

Когда вы

int x = 5; int y = x; x = 4;

x устанавливает значение внутри него до 4, и y все еще имеет значение 5, поскольку его стоимость отдельно.

Единственный способ изменить одну переменную на другую переменную, если обе переменные являются ссылками на объект «изменчивый», а объект мутирован - поскольку оба они смотрят на один и тот же объект, чем их собственные копии, они оба наблюдают одно и то же изменение. (Обратите внимание, например, что строки, будучи неизменяемыми, никогда не будут «внезапно меняться», но массивы и коллекции могут)

+0

вы говорите, что «х» сохраняет значение примитивов непосредственно, но на самом деле не «х» также просто тип ссылки? «x» ничего не может хранить, это всего лишь письмо.Он должен ссылаться на пространство в памяти, например на ссылки на типы объектов, единственное различие заключается в том, что переназначения будут вносить изменения в память, которую он ссылается, вместо того, чтобы изменять, какое пространство памяти оно ссылается. Я прав? –

+1

Не забывайте, что 'x' не требуется выделять пространство в памяти - он может существовать только в регистре или быть оптимизирован из существования процессом компиляции. Кроме того, в Java нет мета-переменных, т. Е. Вы не можете иметь переменную, которую вы можете сказать: «Сделать эту точку переменной« x », а не« x' указывает на «x' сам», поэтому уровень переменной - это самый низкий уровень непереадресации, который вы можете иметь. Вы правы, но не так, как можете использовать в качестве Java-программиста. – Patashu

2

Есть 2 отдельных места для x и y. x и y здесь примитивы не объекты.

Когда вы

int y = x; 

Отдельной памяти для переменной Int y создается, а значение x5 т.е. копируется в эту ячейку.

после этого, если вы переназначить любое другое значение переменной x, выполнив:

x = 4; 

, она не отражает стоимости y.

Даже если вы используете класс Wrapper Integer, он будет вести себя аналогичным образом, так как это неизменные классы. например:

Integer x = new Integer(5); 
Integer Y = x; //now both `x` and `y` point to the same `integer` object with the value 5. 
x= new Integer(4); // now since `x` is pointing to a different object than `y`, both `x` and `y` remain independent(i.e change in one does not reflect in another). 
1

примитивные переменные на самом деле удерживают значение (а не ссылку). Поэтому в любой момент времени вы создаете примитивную переменную, блок памяти (этого примитивного типа) получает зарезервированное значение, независимо от того, вы присвоили значение для этого или нет.

(в любом языке низкого уровня вы можете думать о переменном как регистр)