2013-04-26 6 views
0

Я привык к C++, где вам нужно создать экземпляр всего в конструкторе, но недавняя реализация очень сильно смутила меня. Я просто инстанцирование вещи в строителю, а потом я понял, что этот синтаксис был действителен:Объявление переменных класса Member и их создание

public class DebateCompetition { 
    private boolean isAdvanced; 
    ArrayList<Debate> debates = new ArrayList<Debate>(); //<------ 
    ArrayList<Team> teams; 
    ArrayList<School> schools; 

    public void addSchool(School s) { 
     schools.add(s); 
    } 
} 

Но что оставляет много вопросов. Во-первых: что он делает? Второе: когда new ArrayList<Debate>() называется? В-третьих: Это лучшая практика или нет?

+0

См. Http://stackoverflow.com/questions/4916735/default-constructor-vs-inline-field-initialization – flup

ответ

6

Первое: что он делает?

Все инициализаторы полей выполняются (в порядке) до выполнения кода в конструкторе. (В этом случае вы не объявлен конструктор, так что по умолчанию нет-арг конструктор, который вызывает суперклассы не-арг конструктора.)

Второе: Когда новый ArrayList() называется?

Он вызывается во время создания нового объекта.

Вызов происходит после завершения конструктора суперкласса и перед выполнением операторов в этом конструкторе классов. (В этом случае в конструкторе нет инструкций.)

В-третьих: Является ли это лучшей практикой или нет?

Это прекрасно.

2

Это эквивалент инициализации этих переменных в начале конструктора. Если, кроме того, вы используете блок инициализации экземпляра, они инициализируются перед вызовом блока инициализации. После выполнения конструктора суперкласса порядок: поля, инициализированные в корпусе класса, блоки инициализации, тело конструктора. Если вы только объявляете поля в классе, компилятор автоматически их инициализирует по умолчанию: null для объекта, false для булевых и т. Д.

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