#java #variables
#java #переменные
Вопрос:
Другие ответы для меня не работают. Мой вопрос касается целого числа.
Integer i1 = new Integer(11);
Integer i2 ;
i2 = i1;
System.out.println(i1 " " i2);
i1 = 233;
System.out.println(i1 " " i2);
//~ 11 11
//~ 233 11
Я хочу, чтобы i1 и i2 были связаны.
Комментарии:
1. Совсем не ясно, чего вы пытаетесь достичь. Строка
i1 = 233;
изменяет значениеi1
для ссылки на другойInteger
объект.Integer
само по себе является неизменяемым. Возможно, вы хотитеAtomicInteger
вместо этого, где вы можете изменить значение внутри объекта?
Ответ №1:
В Java java.lang.Integer
является неизменяемым. Это означает, что вы не можете изменить значение объекта Integer (обычным способом). Вы можете создать новый Integer
экземпляр с новым значением.
i1
и i2
содержит ссылку на тот же Integer
экземпляр. Когда вы сделали
i1 = 233;
это означает, что i1
ссылается на другой экземпляр Integer
класса
Если вы хотите, i1
и i2
ссылается на тот же экземпляр, который вы можете использовать AtomicInteger
, но AtomicInteger
был создан для разных целей.
AtomicInteger i1 = new AtomicInteger(11);
AtomicInteger i2 ;
i2 = i1;
System.out.println(i1 " " i2);
i1.set(233);
System.out.println(i1 " " i2);
Или вы можете создать оболочку
public static class IntegerWrapper {
private int value;
public IntegerWrapper(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public IntegerWrapper setValue(int value) {
this.value = value;
return this;
}
}
и код
IntegerWrapper i1 = new IntegerWrapper(11);
IntegerWrapper i2 ;
i2 = i1;
System.out.println(i1.getValue() " " i2.getValue());
i1.setValue(233);
System.out.println(i1.getValue() " " i2.getValue());
Ответ №2:
Когда вы делаете это: i2 = x;
java автоматически делает это i2 = new Integer(x);
за вас, потому Integer
что является неизменяемым. где x = (любой целочисленный литерал)
Комментарии:
1. Надеюсь, вы имели в виду
i2 = (any integer literal);
, иначе это было бы неправильно.2. я думаю, это очевидно. Я просто хочу отметить, что создается новый объект.
3. Это совсем не очевидно. В коде OP
i1
иi2
обаInteger
являются s иi2 = i1;
не будут создавать новый экземплярInteger
.4. Хорошо, строго говоря, это не обязательно должен быть новый объект. Вы правы.
5. Мне бы больше понравилось
Integer.valueOf(i1)
, а неnew Integer(i1);
Ответ №3:
Java всегда создает новый объект при назначении нового целочисленного литерала, потому что целое число является неизменяемым.
Например:
i1=233; // it represent as i1= new Integer(233);
Теперь i1
и i2
как два разных физических адреса.
Ответ №4:
Проблема, с которой вы столкнулись, заключается в том, что i1 = 233
изменяется адрес памяти, на который i1
ссылается.
Ответ №5:
Здесь играет роль автобоксинг. Когда вы назначили
i1=233;
На самом деле это читается как
i1= new Integer(233);
Теперь прочитайте код еще раз. Ваше целое число i2 по-прежнему указывает на объект, содержащий 11, где, поскольку i1 указывает на новый объект, содержащий 233.