2013-04-26 70 views
0

我习惯于C++,在那里你必须实例化构造器中的所有东西,但最近的一个实现让我对java非常困惑。我只是实例化的东西在建筑工,然后我意识到这句法是有效的:声明成员类变量并实例化它们

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 2013-04-26 23:39:03

回答

6

第一:它是做什么的?

所有字段初始值设定项在执行构造函数中的代码之前执行(按顺序)。 (在这种情况下,你还没有宣布一个构造函数,所以有一个默认的无参数的构造函数调用父类无参数的构造函数)。

二:当为新的ArrayList()叫什么名字?

它在实例化一个新对象时被调用。

调用发生在超类构造函数完成之后,并且在执行此类构造函数中的语句之前。 (在这种情况下,构造函数中没有语句)。

第三:这是否是最佳实践?

这很好。

2

这相当于在构造函数的开始初始化这些变量。另外,如果您正在使用实例初始化块,则会在调用初始化块之前初始化它们。执行超类构造函数后,顺序为:在类体中初始化的字段,初始化块,构造函数体。如果只在类体中声明字段,则编译器自动将它们初始化为默认值:对象为null,对于布尔值为false。