2013-04-26 72 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。