Статическая инициализация массива
Какие два фрагмента кода правильно создают и инициализируют статический массив int
элементы? (Выберите два.)
а.
static final int[] a = { 100,200 };
В.
static final int[] a;
static { a=new int[2]; a[0]=100; a[1]=200; }
С.
static final int[] a = new int[2]{ 100,200 };
Д.
static final int[] a;
static void init() { a = new int[3]; a[0]=100; a[1]=200; }
Ответ: A, B
здесь даже D кажется правдой, может ли кто-нибудь сообщить мне, почему D является ложным.
Ответы
Ответ 1
Правильные ответы: 1 и 2 (или A и B с вашими обозначениями), а также правильное решение:
static final int[] a = new int[]{ 100,200 };
Решение D не инициализирует массив автоматически, так как класс загружается средой выполнения. Он просто определяет статический метод (init), который вы должны вызывать перед использованием поля массива.
Ответ 2
D определяет статический метод инициализации a
, но на самом деле не вызывает его. Таким образом, a
остается неинициализированным, если только кто-то явно не вызывает метод init
.
Как указывали другие ответы: D не должен компилироваться, потому что он пытается присвоить значение переменной final
a
. Думаю, это гораздо более правильное объяснение. Тем не менее, даже если a
не был окончательным, D все равно не работал бы без дополнительного кода.
Я предполагаю, что new int[3]
в D - опечатка? Остальные трое пытаются создать массив длиной 2.
Ответ 3
D (4) неверно, потому что a) a
является окончательным, и вы не можете назначить его в init
; б) нет гарантии, что init
будет называться; c) init
не устанавливает третий элемент:
Ответ 4
для фрагмента C Вы не можете указывать размеры (размер) при инициализации
для фрагмента D вы должны инициализировать конечную переменную. Его нельзя инициализировать позже.
Ответ 5
конечные переменные должны быть инициализированы до завершения вызова конструктора. Поскольку "static void init()" - это метод, и он не будет выполняться до конструктора, конечные переменные не будут инициализированы. Следовательно, это ошибка времени компиляции.