web-dev-qa-db-ja.com

Javaの抽象クラスにコンストラクターがあるのはなぜですか?

Javaのabstractクラスにconstructorがあるのはなぜですか?

abstractクラスをインスタンス化できないので、それは何を構築していますか?

何かご意見は?

55
gameover

Javaのコンストラクタは、実際にオブジェクトを「ビルド」するのではなく、フィールドの初期化に使用されます。

抽象クラスにフィールドxとyがあり、最終的に実際の具体的なサブクラスが作成されても、常にそれらを特定の方法で初期化することを想像してください。そのため、コンストラクタを作成してこれらのフィールドを初期化します。

現在、抽象クラスの2つの異なるサブクラスがある場合、それらをインスタンス化すると、コンストラクターが呼び出され、その後、親コンストラクターが呼び出され、フィールドが初期化されます。

何もしなければ、親のデフォルトコンストラクターが呼び出されます。ただし、superキーワードを使用して、親クラスの特定のコンストラクターを呼び出すことができます。

79
Uri

これには2つの理由があります。

1)抽象クラスにはconstructorsがあり、これらのコンストラクターは、具象サブクラスがインスタンス化されるときに常に呼び出されます。クラスをインスタンス化するときは、常にそのクラスのコンストラクターを使用することを知っています。これで、すべてのコンストラクターは、super()への暗黙的な呼び出しを伴うスーパークラスのコンストラクターを呼び出します。

2)コンストラクターは、クラスのフィールドを初期化するためにも使用されることを知っています。また、抽象クラスにはフィールドが含まれる場合があり、場合によってはコンストラクタを使用して初期化されるである必要があることもわかっています。

10
Debmalya

抽象クラスを含むすべてのクラスはコンストラクターを持つことができます。抽象クラスコンストラクターは、その具象サブクラスがインスタンス化されるときに呼び出されます

10
Upul Bandara

別のクラスがそれを拡張でき、子クラスがスーパークラスコンストラクターを呼び出す必要があるためです。

7

抽象クラスには静的(フィールド)があり、時には何らかの方法で初期化する必要があるためです。

4
Andriy Sholokh

この質問の根源は、コンストラクターの呼び出しがオブジェクトを作成すると人々が信じていることだと思います。そうではありません。 Java nowhereは、コンストラクター呼び出しがオブジェクトを作成することを主張しません。一部のフィールドを初期化するなど、コンストラクターに必要なことを実行します。それがすべてです。そのオブジェクトが作成されること。

3
Mandroid

実装に関しては、サブクラスコンストラクターのsuper()ステートメントの内部によく見られます。


public class A extends AbstractB{

  public A(...){
     super(String constructorArgForB, ...);
     ...
  }
}

1
manuel aldana