Фрагмент кода Java - игра с переменной final - требуется пояснение - PullRequest
2 голосов
/ 23 июля 2010
final Integer a = 1;
Integer b = a;

System.out.println("a: " + a); // prints 1
System.out.println("b: " + b); // prints 1

b++;
System.out.println("a: " + a); // prints 1
System.out.println("b: " + b); // prints 2

b = b + 1;
System.out.println("a: " + a); // prints 1
System.out.println("b: " + b); // prints 3

b = 10;
System.out.println("a: " + a); // prints 1
System.out.println("b: " + b); // prints 10

Было бы замечательно, если бы кто-то мог объяснить вывод кода, особенно в отношении переменной B.

Ответы [ 2 ]

7 голосов
/ 23 июля 2010

Хорошо, давайте начнем с этого:

final Integer a = 1;

Вы создали окончательную ссылку на объект Integer, который был автоматически упакован из примитива int.

Эта ссылка может быть назначена ровно один раз, и никогда больше.

Integer b = a;

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

b++;

Это сокращение для следующего утверждения:

b = new Integer(b.intValue() + 1);

И, по совпадению, то же самое для

b = b + 1;

Последнее утверждение:

b = 10

Использует автобокс для сокращения этого утверждения:

b = new Integer(10);

Надеюсь, это поможет.

2 голосов
/ 23 июля 2010

Прежде всего, вы должны знать, что здесь происходит автобокс, вы можете прочитать об этом здесь .

Теперь только b++ кажется мне непростым.Функционально он эквивалентен этому коду:

int bTemp = b.intValue();
bTemp++;
b = Integer.valueOf(bTemp);

Хотя байт-код может немного отличаться.

...