2013-04-18 2 views
3

Верно ли, что каждый массив, который инициализируется во время выполнения, является динамическим, и каждый массив, который инициализируется во время компиляции, является статическим?Java - статическая и динамическая инициализация массива

, например:

int array[];     
public main() {  
    array = new int[100];  
} 

компилятор знает, сколько элементов в массиве, поэтому он может initilize его во время компиляции правильно? или мне нужно дать каждому int значение, чтобы оно стало статическим? так:

int array[3] { 1, 2, 3};    

и это определить Возможное количество элементов массива должно быть вне основной функции()? (без указания каждого значения):

int array[100];  
public main() { 
} 

Я программирую небольшую игру, и она должна работать очень быстро. Я читаю динамические массивы, нужно немного дольше обрабатывать, поэтому я хочу попробовать его со статическими массивами, но я не уверен, когда массив становится статическим или динамическим. Я искал много разных учебников, но я не мог найти ответа на это.
спасибо за чтение.

ответ

7

Различия в динамическом и статическом распределении неоднозначны (это несколько зависит от языка, что это означает). В наиболее общем смысле статическое распределение означает, что определенный размер предопределен, возможно, во время компиляции.

В java любые объекты (включая массивы) всегда выделяются во время выполнения. Это не обязательно означает его динамику, но может быть статичным в том смысле, что его нельзя изменить во время выполнения. Пример:

public class Test1 { 
    public final int[] array1 = new int[10]; 

    public int[] array2 = new int[20]; 

    public void setArray2Size(int size) { 
     array2 = new int[size]; 
    } 
} 

Массив Fixed имеет размер 10 и не может быть изменен во время выполнения. Обратите внимание, что ключевое слово final. Это позволяет назначить член «array1» только один раз. Поэтому вы не можете назначить для этого члена другой массив.

Теперь массив2 не является окончательным, поэтому вы можете в любой момент назначить ему другой массив, как это делает метод setArray2Size(). Если бы не было назначений, чтобы перенести начальное назначение, array2 все равно оставался бы статическим в том смысле, что он не может быть изменен (потому что для этого нет кода), хотя при изменении объявления допускается.

Конкретный экземпляр массива не может быть изменен когда-либо после создания (нет языка для выражения изменения размера массива в java). Это немного сложно понять для новичков, но переменная типа array2 не является массивом. Его ссылка на массив.Вы, однако, можете заменить ссылку, которую имеет массив 2, с ссылкой на другой массив, как показано для array2 в методе setArray2Size().

+0

спасибо за то, что подробно answer :), теперь у меня есть еще один быстрый вопрос: array2 статический (array2 = new int [20], без последующего назначения), но когда я инициализирую array2 следующим образом: array2 = new int [k]; и k - переменная, которая определена во время выполнения, чем массив 2 является динамическим справа? (без последующего назначения) – Jebeto

+0

Да, новый int [x] обычно динамический, но .. переменную «new int [x]» можно было бы * еще * называть семантически статичной, если программа не может изменить решение, однажды сделанное (например, вы читаете x из файла конфигурации при запуске). – Durandal

+0

ОК еще раз спасибо, похоже, что вы много знаете о программировании, thats awsome :) – Jebeto

1

Память не предоставляется в момент declaration.

eg: int array[100];; - не будет compiles

его единственный, когда встречается new, оператор memory.

Так

array = new int[100];; компилирует.

+0

array = new int [100]; является динамически правильным? , но int array [3] {1, 2, 3}; является статическим, так что можно сделать статический массив, не давая целым числам значение? только объявив размер массива? – Jebeto

+0

Нет, вы cannot.see [здесь] [http://stackoverflow.com/questions/1200621/how-to-declare-an-array-in-java] для действительных объявлений –

+0

ok спасибо за помощь – Jebeto

0

Да, размер массива узнается только во время компиляции, но распределение памяти произойдет во время выполнения. Пока вы не встретите «новую» память, не будет выделено массиву.

Смежные вопросы