Java - Ссылочный примитивный тип данных? - PullRequest
2 голосов
/ 25 октября 2011

Я знаю, что со следующим делается ссылка

public class MyClass
{
  public Integer value;
}

public class Main
{
  public static void main( String[] args )
  {
    MyClass john = new MyClass();
    john.value = 10;
    MyClass bob = john;
    bob.value = 20;

    System.out.println(Integer.toString(john.value));  // Should print value of "20"
  }
}

Но как вы делаете аналогичные ссылки с примитивными типами данных?

public class Main
{
  public static void main( String[] args )
  {
    Integer x = 30;
    Integer y = x;
    y = 40;
    System.out.println(Integer.toString(x));  // Prints "30". I want it to print "40"
  }
}

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

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

Объекты-оболочки, такие как Integer, также являются неизменяемыми, т. Е. y = 40 создаст новый объект Integer со значением 40 и присвоит ему y.

Для достижения желаемого вам нужен контейнерный объект, значение которого вы можете изменить.

Вы можете, например, использовать AtomicInteger:

AtomicInteger x = new AtomicInteger(30);
AtomicInteger y = x;
y.set( 40 );

System.out.println(x.get());
1 голос
/ 25 октября 2011

Вы не можете.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} T тогда, когда

Integer y = x;
y = new Integer(40);

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * при этом: *1003* *.Этот механизм называется auto-boxing .Существует простое правило: чтобы изменить состояние объекта, а не заменить весь объект, вам необходимо вызвать один из методов вашего объекта.Классы, представляющие значения , такие как числа, довольно часто не предоставляют такие методы, но требуют, чтобы объект был заменен новым, представляющим новое значение.

0 голосов
/ 25 октября 2011

В вашем втором блоке кода происходит то, что 30 помещается в целое число и присваивается x.Затем вы назначаете это же целое число на y.x и y теперь указывают на один и тот же объект.Но когда вы делаете y = 40, эти 40 упаковываются в новый объект Integer и присваиваются y.Класс Integer является неизменным, вы не сможете изменить его значение после создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...