問題の歴史:
Javaの初期バージョンには、子クラスが親クラスの動作を拡張できる継承メカニズムが組み込まれています。親クラスのメンバーにアクセスするためには、C++から継承されたキーワードsuperを使用します。
問題:
メソッドやフィールドがオーバーライドまたは隠蔽されている場合に、親クラスのメソッドやフィールドに明示的にアクセスする必要があることがあります。正しくsuperを使用しないと、エラーや不正な動作が発生する可能性があります。例えば、コンストラクタを扱うときなどです。
解決策:
superを使用することで:
例:
class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal sound System.out.println("Bark"); } }
主な特徴:
superの呼び出しはコンストラクタの最初の行でなくてもよいですか?
いいえ。super()を使用して親のコンストラクタを呼び出すことは、コンストラクタの最初の行である必要があります。この制約が守られないと、コンパイラがエラーを表示します。
staticメソッドやコンテキストでsuperを使用できますか?
いいえ。キーワードsuperは、オブジェクトの階層に関連しているため、非定数(インスタンス)コンテキストでのみ適用可能です。
superを介して親のプライベートメソッドにアクセスできますか?
いいえ。プライベートメソッドは子クラスから見えないため、superを介してもアクセスできません。public、protected、package-privateメソッドやフィールドのみがsuperを介して利用可能です。
開発者が派生クラスのコンストラクタでsuper()を明示的に呼び出すのを忘れ、親クラスにデフォルトコンストラクタがない。
長所:
短所:
サブクラスでオーバーライドされたメソッドが最初にsuperの実装を呼び出し、その後追加のロジックを拡張します。
長所:
短所: