Свойство длины массива в Java
Пожалуйста, не возражайте, это просто вопрос о длине массива. Как новичок в Java, я столкнулся с константой и последним ключевым словом, которое описывается как:
Константы являются неизменяемыми переменными, объявленными с ключевым словом final. Их значения не могут быть изменены во время выполнения программы. Также константы должны быть инициализированы во время объявления. Например:
final double PI = 3.1415926; // Need to initialize
Я прочитал почти все связанные посты, но у меня путаница по поводу его инициализации. Я пытался погрузиться в его класс, используя IDE Netbeans, но его реализация там не была видна.
Как насчет поля длины, чтобы получить длину массива?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html
Как и когда он инициализируется (время выполнения / время компиляции)?
2 ответа
Из спецификации виртуальной машины Java. Глава 3. Компиляция для виртуальной машины Java. 3.9 Массивы:
Массивы виртуальных машин Java также являются объектами. Массивы создаются и обрабатываются с использованием определенного набора инструкций.
newarray
Инструкция используется для создания массива числового типа. Код:void createBuffer() { int buffer[]; int bufsz = 100; int value = 12; buffer = new int[bufsz]; buffer[10] = value; value = buffer[11]; }
может быть скомпилировано в:
Method void createBuffer() 0 bipush 100 // Push int constant 100 (bufsz) 2 istore_2 // Store bufsz in local variable 2 3 bipush 12 // Push int constant 12 (value) 5 istore_3 // Store value in local variable 3 6 iload_2 // Push bufsz... //line below is what you're looking for [comment is mine] 7 newarray int // ...and create new int array of that length 9 astore_1 // Store new array in buffer 10 aload_1 // Push buffer 11 bipush 10 // Push int constant 10 13 iload_3 // Push value 14 iastore // Store value at buffer[10] 15 aload_1 // Push buffer 16 bipush 11 // Push int constant 11 18 iaload // Push value at buffer[11]... 19 istore_3 // ...and store it in value 20 return
newarray int
Инструкция инициализирует массив и его длину. Это означает, что длина массива инициализируется при инициализации массива во время выполнения.
Объяснение по ссылке выше также объясняет, как массив ссылок создается anewarray
инструкция и показывает аналогичную картину.
Это действительно хороший вопрос на самом деле!
Это требует некоторых глубоких знаний о том, как работают компиляторы. Я потратил время на написание компилятора языка со вкусом Си.
Как это работает, так это то, что константы проверяются типом передним концом компилятора во время компиляции. Это гарантирует, что они являются ожидаемым типом и находятся в ожидаемом диапазоне, учитывая другие свойства объявленного идентификатора.
Теперь, большинство компиляторов имеют связанные с ними токены с перспективами (у всех, кроме ранних языков, есть эта особенность). Это работает так, что во время компиляции оператор в скобках '[' и ']' подвергается синтаксическому и symtanic анализу во внешней части компилятора, чтобы убедиться, что он действителен и известен во время компиляции.
Поле длины массива находится в области класса / метода во время среды выполнения Java, поэтому оно не будет инициализировано до времени выполнения.