Операция внутри, когда мы добавляем два объекта 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 пример.

Другие вопросы по тегам