Java がコンストラクターがプライベートなクラスからの継承を許可しないのはなぜですか?
6 に答える
クラスはそのスーパー クラス コンストラクターを常に呼び出さなければならないためです。スーパークラスのコンストラクターにアクセスできない場合、サブクラスは初期化できません。
ブライアン・ローチのコメントについて:
[親クラス コンストラクターへの] 呼び出しは、明示的に行わず、親にパブリックまたはプロテクトの引数なしコンストラクターがある (または、デフォルトの引数なしがある場合は何も定義されていない) 場合にのみ暗黙的です。それが必要なのは...それが言語の仕組みだからです。子 [クラス] は [それらの] 親のコンストラクターを呼び出さなければなりません。
Java で任意のObject
クラスをインスタンス化する場合、コンストラクターはすべてのクラスのスーパー クラスであるため、コンストラクターへの暗黙的な呼び出しが常にあることに注意してください。デフォルトのコンストラクターを実行します。
public Object() {
}
JLSリンクからのメモ:
デフォルトのコンストラクターが暗黙的に宣言されているが、スーパークラスに、引数を取らず、throws 句を持たないアクセス可能なコンストラクター(§6.6) がない場合、コンパイル時エラーになります。
サブクラスがある場合、子クラス (サブクラス) コンストラクターには 2 つの可能性があります。プライベートです。2. パラメーター化されたコンストラクター: パラメーター化されたコンストラクターを持つ子クラスのオブジェクトを作成しようとすると、パラメーターを渡すか、パラメーターを渡さないことで、子クラスのコンストラクターから親クラスのコンストラクターを強制的に呼び出す必要があります。親コンストラクターがプライベート。
子クラスにはデフォルトのコンストラクターまたはパラメーター化されたコンストラクターがあり、それらのいずれかを持つことはできないため、プライベート コンストラクターを持つ親クラスのサブクラスを持つことはできません。
クラスのコンストラクターがプライベートの場合、子クラスはスーパー コンストラクターを呼び出すことができません。したがって、継承は失敗します。
はい、Luiggi の回答に何かを追加します。Java のこの機能は、そのクラスのインスタンスを 1 つだけ作成できるシングルトン クラスを作成するときに使用されます。
これは、継承を行うとき、コンパイラの仕事は、すべてのクラス コンストラクターの最初のステートメントで super() を記述することによって、すべてのクラスと Object クラスとの直接的または間接的な関係を作成することだからです。コンストラクターをプライベートとして作成すると、クラスの外部からアクセスできないことを意味しますが、継承を行うと、コンパイラーはこのタイプのステートメントを暗黙的に書き込みます。
class SubClassName extends SuperClassName {
public SubClassName() {
super(); // which will indirectly going to call the Parent class constructor from outside its scope
}
}