Присваивание примитиву примитив

230
26 мая 2017, 12:33

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

int second = first;

Я вот сомневаюсь, что при изменении first изменится и second, это не нужно.

А если так?

int second = 0 + first;

Так?

int second = new Integer(first);

Так?

int second = Integer.valueOf(first);

Помогите разобраться

Answer 1

Если всё это написано в 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]);
    }
Answer 2

Примитивы в 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

Answer 3

А можно ли сделать так?

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 (как и все другие объектные оболочки примитивов) является неизменяемым.

READ ALSO
Как использовать Stateless Session beans в Spring?

Как использовать Stateless Session beans в Spring?

У меня есть проект на git, который я написал в рамках прохождения лабораторных работ (лаба в которой описаны задачи, функционал и тех требования)

331
Что лучше использовать EventBus или Otto?

Что лучше использовать EventBus или Otto?

Что лучше использовать EventBus или Otto?

302
Hibernate Native SQL With Criteria

Hibernate Native SQL With Criteria

Подскажите пожалуйста как лучше всего организовать следующее

322
Отправка сообщений по MAP-протоколу

Отправка сообщений по MAP-протоколу

Есть приложение, которое определяет местоположение абонентаВ данный момент приложение берет информацию у HLR при помощи mml команд

314