2015-04-29 4 views
1

Что случилось с программой ниже?Зачем мне нужно `{...}` заполнять массив в области класса?

package test; 

public class Test { 

    byte[] array = new byte[2]; 
    array[0] = 'A'; 
    array[1] = 'B'; 
} 

Посмотрите, среда указывают на некоторые проблемы (нажмите, чтобы увеличить):

enter image description here

В другом слове, почему я должен переместить наполнителя линии на другую внутреннюю сферу, как следующие:

package test; 

public class Test { 

    byte[] array = new byte[2]; 
    { 
     array[0] = 'A'; 
     array[1] = 'B'; 
    } 
} 

IDE не имеет проблем с описанной выше программой.

+0

С 'array [0] = 'A';' вы не инициализируете новую переменную, вы заполняете существующий массив. Я не экспорт Java, но это не удивляет меня, что вы не можете сделать это в описании класса в качестве новой инициализации. – Fractaliste

+0

Скриншоты IDE - это отвратительный способ совместного использования кода. Попытайтесь найти где-нибудь в своей среде IDE (например, окно вывода компилятора), где вы можете захватить сообщения об ошибках как текст для включения в свой вопрос. –

+0

Ответ ... потому что JLS определяет его так. Вы можете посмотреть JLS 8.1.6 - https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.6. Также в качестве примечания вы можете просто использовать здесь инициализатор массива (который действителен), т. Е. 'Byte [] array = {'A', 'B'}'; –

ответ

6

в этом фрагменте кода вы пытаетесь сделать некоторые задания (для массива: например array[0] = 'A') вне любого метода

public class Test { 
    byte[] array = new byte[2]; 
    array[0] = 'A'; 
    array[1] = 'B'; 
} 

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

public class Test { 
    byte[] array = new byte[2]; 
    { 
     array[0] = 'A'; 
     array[1] = 'B'; 
    } 
} 

, если вы хотите сделать это в своем коде, вы можете сделать это, например, по методу init.

public class Test { 
    byte[] array = new byte[2]; 

    void initArray() { 
     array[0] = 'A'; 
     array[1] = 'B'; 
    } 
} 
+0

Итак, ответ: мой первый фрагмент неверен, потому что язык Java определен таким образом, что мы не можем присвоить значения массивам таким образом в области видимости класса, и мы должны перенести эти назначения внутри метода или внутри инициализатора экземпляра block (** ie '{...}'? **). ** Правильно? ** (И также я могу использовать 'byte [] array = {'A', 'B'};' вместо этого) – Abraham

+0

@Abraham Вы абсолютно правы с обоими предположениями. И выполнение объявления и присвоения в одной строке 'byte [] array = {'A', 'B'};' является обычным способом (для простых назначений). – SubOptimal

+0

@vikingsteve Для блока 'static initializer' нет примера. Само использование зависит от случая. Но я согласен, что не следует злоупотреблять, если другой подход подходит лучше (чего следует избегать: длительная инициализация, инициализация объектов с тяжелым весом и т. Д.). – SubOptimal

1

{....} в вашем примере называются initialization blocks. Они используются для установки значения «конечных» статических переменных, тогда как конструктор не может. В вашем случае они вам не нужны, вы вполне можете инициализировать свой массив в своем конструкторе.

Причина, по которой она не работает в первую очередь без инициализаторов, состоит в том, что это просто недействительный синтаксис java.

Смотрите также this и this для получения дополнительной информации

1

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

// much better, and much smaller 
public class Test { 
    byte[] array = {'A', 'B'}; 
} 
+0

* «Пожалуйста, не используйте статические блоки инициализатора, где это возможно». * .. он не использует один, поэтому все в порядке. – Tom

+0

Прочтите это: https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html и посмотрите разницу между блок-инициализатором _static_ и блок инициализатора _instance. – Tom

+1

Спасибо, что указали, что Том. Исправлен мой ответ – vikingsteve

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