Допустим, есть число, которое высчитывается долгим путем, нужно создать это же число. Делал всегда такое же высчитывание для второго числа. А можно ли сделать так?
int second = first;
Я вот сомневаюсь, что при изменении first
изменится и second
, это не нужно.
А если так?
int second = 0 + first;
Так?
int second = new Integer(first);
Так?
int second = Integer.valueOf(first);
Помогите разобраться
Если всё это написано в main методе, что то типа:
int first=100;
int second=first
// пересчитываем first
Как бы ты не задавал second, она не будет изменятся в будущем, потому что он запоминает определённое значение, а не ссылку на значение. В отличии от массива или объектной переменной:
public static void main(String[] arg){
int[] first={1};
int[] second=first;
first[0]++;
System.out.println(first[0]+" "+second[0]);
}
Примитивы в Java передаются по значению, объектные типы - по ссылке. Это означает что операция присвоения приведет к копированию значения (!) переменной примитивного типа, и к копированию ссылки на объект объектного типа.
То есть, в случае с примитивами - Вы получите две переменные имеющие одинаковые значения:
int a = 1;
int b = a;
b++;
System.out.println("A = " + a + " / b = " + b); // выведет "A = 1 / b = 2"
В случае с объектными типами - Вы получите две ссылки на один и тот же объект.
MyObj obj1 = new MyObj()
obj1.name = "Hello";
MyObj obj2 = obj1;
obj2.name = "world";
System.out.println("obj1.name = " + obj1.name + "// obj2.name = " + obj2.name); // выведет "obj1.name = world // obj2.name = world"
Подробнее информацию можно найти тут: http://info.javarush.ru/translation/2014/06/30/Передача-параметров-в-Java-Перевод-.html
А можно ли сделать так?
int second = first;
Да, можно (а почему нет-то?).
Я вот сомневаюсь, что при изменении first
изменится и second
, это не нужно
И правильно сомневаетесь, не изменится.
А если так?
int second = 0 + first;
И так не изменится.
Так?
int second = new Integer(first);
Так тоже не изменится. Здесь создается объект класса Integer
, который затем автораспаковывается в int
.
Так?
int second = Integer.valueOf(first);
В этом случае тоже не изменится.
Давайте подробнее рассмотрим последние два случая:
Integer a = 5;
Integer b = new Integer(5);
System.out.println(a == b);
Здесь на консоль будет выведено false
, так как a
и b
– это два разных объекта.
В этом же случае:
Integer a = 5;
Integer b = Integer.valueOf(5);
System.out.println(a == b);
на консоль будет выведено true
, так как метод Integer.valueOf(...)
сначала проверит, есть ли объект со значением 5
в пуле, и, если есть, возвратит ссылку на существующий объект*, в противном случае будет создан новый объект. Так как объект со значением 5
уж есть в пуле (a
), то метод Integer.valueOf(...)
возвратит ссылку на него и a == b
будет истинно.
*пул ограничивается некоторыми значениями, как правило это [-128;127]
. Пример:
Integer a = 500;
Integer b = Integer.valueOf(500);
System.out.println(a == b);
Здесь будет выведено на консоль false
, так как объект со значением 500
в пуле размещен не будет.
И еще один случай:
Integer a = 5;
Integer b = a;
a = 10;
System.out.println(a);
System.out.println(b);
На консоли увидите:
10
5
Так как в строке Integer b = a;
происходит копирование ссылки и при выполнении a = 10;
будет создан новый объект (или считан объект из пула), так как Integer
(как и все другие объектные оболочки примитивов) является неизменяемым.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
У меня есть проект на git, который я написал в рамках прохождения лабораторных работ (лаба в которой описаны задачи, функционал и тех требования)
Есть приложение, которое определяет местоположение абонентаВ данный момент приложение берет информацию у HLR при помощи mml команд