Допустим, есть число, которое высчитывается долгим путем, нужно создать это же число. Делал всегда такое же высчитывание для второго числа. А можно ли сделать так?
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 (как и все другие объектные оболочки примитивов) является неизменяемым.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей