Почему при компиляции в Java - массив int преобразуется в массив Object? Ведь int это примитивный тип. Каким образом оно все становится объектом и главное зачем?
UPD. Услышал об этом в "61й подкаст Solo на .Net — Гонения на Java" (Тайминг: 3:00-3:20).
Хотя У Эккеля написано, что массив - это объект, в котором хранятся ссылки на объекты. Ну ведь int не объект...
Это не так. Возьмём простой код
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]
Меньше слушайте подкасты.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть у нас приложение на андроид, у которого на фоне стоит картинка в PNG формате на которой в центре расположены 3 квадратаМне нужно создать...
Для общения с серваком, нужно отправлять ему несколько xml - так прописано в документации, и вот тут возникли сложности, так как второй xml не создается
Учусь программироватьУ меня есть классы (Базовый и производный)