Операция внутри, когда мы добавляем два объекта Integer?
Может кто-нибудь объяснить мне, как внутреннее поведение, когда мы добавляем два объекта Integer в Java? (как будто это unbox Object в примитивы, а затем добавить два целых числа и, наконец, заключить его в объект Integer)
Integer sum = new Integer(2) + new Integer(4);
2 ответа
Это скомпилировано в это:
Integer sum = Integer.valueOf(new Integer(2).intValue()+new Integer(4).intValue());
Вы можете убедиться в этом, посмотрев разбор байтового кода, полученный с javap -c
,
Вот часть, которая соответствует новому Integer (2).intValue (), оставляя int 2 в стеке:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: invokevirtual #4; //Method java/lang/Integer.intValue:()I
Вот часть, которая соответствует новому Integer (4).intValue (), оставляя int 4 в стеке:
11: new #2; //class java/lang/Integer
14: dup
15: iconst_4
16: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
19: invokevirtual #4; //Method java/lang/Integer.intValue:()I
И здесь сумма 2+4 рассчитывается с iadd
сумма суммируется в целое число путем вызова Integer.valueOf
и результат сохраняется в первой локальной переменной (astore_1
):
22: iadd
23: invokestatic #5; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
26: astore_1
Создание двух Integer
экземпляров.
Автоматическая распаковка этих двух экземпляров.
новый int
который держит результат.
Автобокс результат в Integer sum
пример.