Вот что происходит в вашем коде:
Integer i = new Integer(17);
Эта строка создает две вещи:
- Локальная переменная типа
Integer
с именем i
.
- Новый
Integer
объект со значением 17
.
Локальная переменная инициализируется ссылкой на вновь созданный объект Integer
(т.е. теперь она указывает на объект Integer
).
Объект Integer
нельзя изменить, поскольку он неизменен.
Локальную переменную можно изменить, присвоив ей новую ссылку.
engine.put( "i", i );
Эта строка передает значение из i
(которое является ссылкой на объект Integer
) в метод put()
. Это означает, что put
только знает об объекте Integer
и не о переменной i
. А поскольку сам объект Integer
нельзя изменить, не может повлиять на метод (или любой другой метод), чтобы повлиять на то, что хранится в локальной переменной i
.
engine.eval( "i++;" ); // Now execute JavaScript
Этот метод эффективно обрабатывает переменную JavaScript i
, созданную предыдущей строкой. Эта переменная была инициализирована со значением локальной переменной Java i
, но это не то же самое, что локальная переменная .
assertEquals( 18, i.intValue() );
Здесь вы проверяете значение локальной переменной Java i
, которое не изменяется. только способ сделать это утверждение правильным, назначив что-то еще i
(например, i = new Integer(18)
).