9

Java がコンストラクターがプライベートなクラスからの継承を許可しないのはなぜですか?

4

6 に答える 6

21

クラスはそのスーパー クラス コンストラクターを常に呼び出さなければならないためです。スーパークラスのコンストラクターにアクセスできない場合、サブクラスは初期化できません。

詳細: JLS 8.8.10。クラスのインスタンス化の防止


ブライアン・ローチのコメントについて:

[親クラス コンストラクターへの] 呼び出しは、明示的に行わず、親にパブリックまたはプロテクトの引数なしコンストラクターがある (または、デフォルトの引数なしがある場合は何も定義されていない) 場合にのみ暗黙的です。それが必要なのは...それが言語の仕組みだからです。子 [クラス] は [それらの] 親のコンストラクターを呼び出さなければなりません。

Java で任意のObjectクラスをインスタンス化する場合、コンストラクターはすべてのクラスのスーパー クラスであるため、コンストラクターへの暗黙的な呼び出しが常にあることに注意してください。デフォルトのコンストラクターを実行します。

public Object() {
}

JLSリンクからのメモ:

デフォルトのコンストラクターが暗黙的に宣言されているが、スーパークラスに、引数を取らず、throws 句を持たないアクセス可能なコンストラクター(§6.6) がない場合、コンパイル時エラーになります。

于 2013-05-21T03:21:28.133 に答える
1

サブクラスがある場合、子クラス (サブクラス) コンストラクターには 2 つの可能性があります。プライベートです。2. パラメーター化されたコンストラクター: パラメーター化されたコンストラクターを持つ子クラスのオブジェクトを作成しようとすると、パラメーターを渡すか、パラメーターを渡さないことで、子クラスのコンストラクターから親クラスのコンストラクターを強制的に呼び出す必要があります。親コンストラクターがプライベート。

子クラスにはデフォルトのコンストラクターまたはパラメーター化されたコンストラクターがあり、それらのいずれかを持つことはできないため、プライベート コンストラクターを持つ親クラスのサブクラスを持つことはできません。

于 2014-08-29T14:54:44.937 に答える
1

クラスのコンストラクターがプライベートの場合、子クラスはスーパー コンストラクターを呼び出すことができません。したがって、継承は失敗します。

于 2013-05-21T03:21:35.620 に答える
0

はい、Luiggi の回答に何かを追加します。Java のこの機能は、そのクラスのインスタンスを 1 つだけ作成できるシングルトン クラスを作成するときに使用されます。

于 2013-05-21T03:30:08.477 に答える
0

これは、継承を行うとき、コンパイラの仕事は、すべてのクラス コンストラクターの最初のステートメントで super() を記述することによって、すべてのクラスと Object クラスとの直接的または間接的な関係を作成することだからです。コンストラクターをプライベートとして作成すると、クラスの外部からアクセスできないことを意味しますが、継承を行うと、コンパイラーはこのタイプのステートメントを暗黙的に書き込みます。

class SubClassName extends SuperClassName {
  public SubClassName() {
    super();  // which will indirectly going to call the Parent class constructor from outside its scope
  }
}
于 2020-11-07T13:54:10.927 に答える