インスタンスメソッドとインスタンス変数の継承における関係について学んできた。次に、コンストラクターメソッドに移る。

コンストラクターメソッドは、クラスのインスタンスをセットアップするメソッドを呼び、そのオブジェクトに必要な変数を作成する。

クラスを継承した際には、サブクラスは独自のコンストラクターメソッドを定義できる。サブクラスのコンストラクターメソッドは、サブクラスに関連するセットアップと、サブクラスで必要な変数の定義を行い、スーパークラスのコンストラクターメソッドも実行する。

サブクラスのコンストラクターメソッドを定義する場合には、スーパークラスのコンストラクターをsuperキーワードで呼び出す必要がある。さらに、スーパークラスのコンストラクターメソッドは、インスタンス変数又はインスタンスメソッドへのアクセスよりも先に呼ばなければならない。もし、このような呼び出しがされなかった場合、コンパイラーは引数無しでスーパークラスのコンストラクターを自動的に呼び出す。最後に、superはコンストラクターメソッドの中で1回しか使えない。

インスタンス変数又はインスタンスメソッドにアクセスした後でのsuperの使用を禁止することには、以下のメリットがある。
  • 初期化が完了していないオブジェクトのメソッドが呼び出されるのを防ぐ
  • 初期化が完了していないオブジェクトの変数へのアクセスを防ぐ
  • スーパークラスへのコンストラクターへの変数の代入が、サブクラスのコンストラクターへの変数の代入を上書きしないようにする
super()と、super.methodName()の違いに注意。super()はスーパークラスのコンストラクターメソッドの呼び出しで、サブクラスのコンストラクター内で1回だけしか使えない。一方、super.methodName()は、サブクラスのどこでも、何回でも使える。

superを使って、スーパークラスのコンストラクターメソッドを呼び出してみる。
例:
public class A {
    public function A() {

    }
}

public class B extends A {
    // サブクラスのコンストラクター
    public function B () {
        // スーパークラスのコンストラクターメソッドを呼び出し
        super();
    }
}
今日の進捗:2823→2891/20168