Почему int [] компилируется в Object []?

100
04 марта 2021, 00:10

Почему при компиляции в Java - массив int преобразуется в массив Object? Ведь int это примитивный тип. Каким образом оно все становится объектом и главное зачем?

UPD. Услышал об этом в "61й подкаст Solo на .Net — Гонения на Java" (Тайминг: 3:00-3:20).

Хотя У Эккеля написано, что массив - это объект, в котором хранятся ссылки на объекты. Ну ведь int не объект...

Answer 1

Это не так. Возьмём простой код

public class Example {
    public static void main(String[] args) {
        int[] a = new int[0];
    }
}

и скомпилируем с отладочными символами

javac -g Example.java

а потом посмотрим полученный байткод

javap -c -p -v Example

увидим (я убрал лишнее)

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=2, args_size=1
         0: iconst_0
         1: newarray       int
         3: astore_1
         4: return
      LineNumberTable:
        line 3: 0
        line 5: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  args   [Ljava/lang/String;
            4       1     1     a   [I

Слот под переменную имеет тип [I - массив целых чисел, а не [Ljava/lang/Object;.

С помощью jol можно посмотреть и расположение в памяти в рантайме.

import org.openjdk.jol.info.GraphLayout;
import org.openjdk.jol.vm.VM;
public class Example {
    public static void main(String[] args) {
        int[] a = new int[10];
        for (int i = 0; i < 10; i++) {
            a[i] = i;
        }
        System.out.println(VM.current().details());
        System.out.println(GraphLayout.parseInstance(a).toPrintable());
    }
}

Компилируем

javac -cp jol-cli-0.9-full.jar Example.java

Запускаем

java -javaagent:jol-cli-0.9-full.jar Example

Получаем

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
[I@31221be2d object externals:
          ADDRESS       SIZE TYPE PATH          VALUE
        76b228fd8         56 [I                 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Меньше слушайте подкасты.

READ ALSO
Расположение элементов на экране

Расположение элементов на экране

Есть у нас приложение на андроид, у которого на фоне стоит картинка в PNG формате на которой в центре расположены 3 квадратаМне нужно создать...

103
Второй xml не создается

Второй xml не создается

Для общения с серваком, нужно отправлять ему несколько xml - так прописано в документации, и вот тут возникли сложности, так как второй xml не создается

82
Database Change Notification

Database Change Notification

Разбираюсь с механизмом нотификаций в ораклеВозникло два вопроса

116
Почему приведение типов к базовому не заставляет выполнять метод базового типа?

Почему приведение типов к базовому не заставляет выполнять метод базового типа?

Учусь программироватьУ меня есть классы (Базовый и производный)

95