Учебник по Java: "размер массива должен быть известен во время компиляции"

Я просто просматривал один из моих старых учебников и нашел этот отрывок определении массивов в языке Java:

одномерный массив-это структурированный тип данных, составленный из ограниченная коллекция fixedsize упорядоченных однородных элементов к которому есть прямой доступ. Конечный указывает, что существует последний элемент. Фиксированный размер означает, что размер массива должен быть известен на время компиляции, но это не значит, что все слоты в массиве должен содержат значимые значения.

У меня есть базовое понимание массивов и мне удобно использовать их в повседневных задачах, но меня очень смущает утверждение, что размер массивов должны быть известен во время компиляции.

очень простая программа Java демонстрирует, что массив может быть создан с переменным размером во время выполнения:

import java.util.Scanner;

public class test
{
   public static void main(String[] args)
   {
      Scanner scan = new Scanner(System.in);
      System.out.print("Enter a number: ");
      int size = scan.nextInt();
      int[] array = new int[size];
      System.out.println("You just create an array of size " + array.length);
   }
}

это компилирует, выполняет и достигает конца без ошибок.

что дает?

2 ответов


Это очень плохо сформулированный абзац, но если вы интерпретируете его свободно, это правильно.

в вашем примере размер массива is известен во время компиляции. Размер size.

вы интерпретируете "известный во время компиляции" с "статическим" или "постоянным", что понятно. Конечно, как мы знаем, JVM выделяет память динамически на основе значения size.

автор, вероятно, пытается провести различие между массив и что-то вроде ArrayList, где размеры не должны быть заданы при инициализации.


размер массива здесь "размер". Компилятор не беспокоится о том, что может быть там в "размере". Память не выделяется во время компиляции, она выделяется во время выполнения. Во время компиляции переменные не проверяются напрямую, чтобы получить их значения. Его только во время выполнения компилятор видит, что присутствует в "размере" и выделяет память.