Свойство длины массива в 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, поэтому оно не будет инициализировано до времени выполнения.

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