статическая инициализация целочисленного массива - PullRequest
17 голосов
/ 15 декабря 2010

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

A.

static final int[] a = { 100,200 };

B.

static final int[] a;
static { a=new int[2]; a[0]=100; a[1]=200; }

С

static final int[] a = new int[2]{ 100,200 };

D.

static final int[] a;
static void init() { a = new int[3]; a[0]=100; a[1]=200; }

Ответ: A, B

здесь даже D кажется правдой, может кто-нибудь сообщить мне, почему D ложно.

Ответы [ 5 ]

24 голосов
/ 15 декабря 2010

Правильные ответы - 1 и 2 (или A и B с вашей записью), а также правильное решение будет:

static final int[] a = new int[]{ 100,200 };

Решение D не инициализирует массив автоматически, так как класс загружается во время выполнения. Он просто определяет статический метод (init), который необходимо вызвать перед использованием поля массива.

6 голосов
/ 15 декабря 2010

D определяет статический метод для инициализации a, но фактически его не вызывает. Таким образом, a остается неинициализированным, если кто-то явно не вызывает метод init.

Как указывалось в других ответах: D даже не должен компилироваться, поскольку он пытается присвоить значение переменной final a. Я думаю, это гораздо более правильное объяснение. Тем не менее, даже если a не является окончательным, D все равно не будет работать без дополнительного кода.

Я предполагаю, что new int[3] в D - опечатка? Все остальные три пытаются создать массив длиной 2.

3 голосов
/ 15 декабря 2010

D (4) неверно, потому что a) a является окончательным, и вы не можете назначить его в init;б) нет гарантии, что init будет вызван;в) init не устанавливает третий элемент;

1 голос
/ 15 декабря 2010

для фрагмента C Вы не можете указать размеры (размер) при инициализации для фрагмента D вы должны инициализировать конечную переменную. Это не может быть инициализировано позже.

0 голосов
/ 20 июля 2015

final переменные должны быть инициализированы до завершения вызова конструктора. Поскольку «static void init ()» является методом и не будет выполняться до конструктора, конечные переменные не будут инициализированы. Следовательно, это ошибка времени компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...