新しいオブジェクトを作成すると、クラスのコンストラクタの1つだけが呼び出され、オブジェクトが初期化されます。あなたは、すべてのコンストラクタが呼び出されるか、デフォルト(引数なし)コンストラクタが常に呼び出されると考えるようです。そうではありません。
したがって、各コンストラクタはすべての final
メンバ変数を初期化する必要があります。
あるコンストラクタから this(...)
を使って別のコンストラクタを明示的に呼び出すことができます。たとえば、 C(int i)
コンストラクタの最初の行に this();
という行を追加して、/code>コンストラクタです。別の解決策は、宣言した行のメンバ変数を初期化することです:
public class C {
//v will be initialized, no matter which constructor will be used
final Vector v = new Vector();
C() {
}
C(int i) {
//...
}
//... etc.
}
final
メンバー変数を明示的に初期化する必要はありません。それらを初期化しないと、Javaはデフォルト値(非プリミティブ型変数の場合は null
)で初期化します。しかし、 final
メンバ変数を明示的に初期化する必要があります。
別の注記: Vector
は従来のコレクションクラスです。代わりに ArrayList
を使用する方がよいでしょう。
Third note: Use generics to make your code more type-safe. For example, if you need to store strings in a list, use ArrayList
instead of the raw type ArrayList
.