スーパークラスのコンストラクタ

2010 年 6 月 10 日 木曜日  【 カテゴリー: Javaの基本


前回は 継承 (インヘリタンス) についてみました。継承ではフィールドやメソッドについては引継がれますがコンストラクタは引き継がれません。そこで今回はスーパークラスのコンストラクタの呼び出しについてみていきます。

スーパークラスのコンストラクタを実行

【Animal .java】

class Animal {
    Animal (){        //(1)
    	System.out.println("スーパークラスのコンストラクタ1");
    }
    Animal (int x){   //(2)
    	System.out.println("スーパークラスのコンストラクタ2");
    }
}

スーパークラスです。コンストラクタをオーバーロードしています。

【Birds.java】

class Birds extends Animal {
    Birds (){
    	super(1);
    	System.out.println("サブクラスのコンストラクタ");
    }
}

コンストラクタはインスタンスの生成時に一度だけ呼び出されます。別のコンストラクタを呼び出すときもコンストラクタ内からでないとエラーになります。スーパークラスのコンストラクタの呼び出しは4行目のように

super(引数1、引数2、・・・・)

で記述します。superに指定した引数の型や引数の数により、スーパークラスのどのコンストラクタを呼び出すか判断されます。スーパークラスののコンストラクタを実行した後、自分のコンストラクタ処理の続きを行います。

【Sample.java】

public class Sample {
    public static void main(String[] args) {
    	Birds birds  = new Birds();
    }
}
スーパークラスのコンストラクタ2
サブクラスのコンストラクタ

Birdsクラスの3行目の super でスーパークラスであるAnimal クラスのコンストラクタ(2)が呼び出され、その後に自分のコンストラクタの続きが実行されているのがわかります。

super(仮引数, ・・・)の位置

class Birds extends Animal {
    Birds (){
    	System.out.println("サブクラスのコンストラクタ");
    	super(1);
    }
}
Exception in thread "main" java.lang.Error:
                     Unresolved compilation problem:
	コンストラクター呼び出しは、コンストラクター内の
        最初のステートメントである必要があります

「super」の位置には制約があります。コンストラクタの一番最初に記述しなければなりません。サンプルのようにコンストラクタの最初のステートメントに書かないとエラーになります。

super(仮引数, ・・・)の省略

サブクラスのコンストラクタでスーパークラスのコンストラクタの呼び出す処理を記述しない場合、どのような処理がされるかみていきます。

【Animal .java】

class Animal {
    Animal (){        //(1)
    	System.out.println("スーパークラスのコンストラクタ1");
    }
    Animal (int x){   //(2)
    	System.out.println("スーパークラスのコンストラクタ2");
    }
}

【Birds.java】

class Birds extends Animal {
    Birds (){
    	System.out.println("サブクラスのコンストラクタ");
    }
}

※コンストラクタに super(仮引数, ・・・) の記述がない

【Sample.java】

public class Sample {
    public static void main(String[] args) {
    	Birds birds  = new Birds();
    }
}
スーパークラスのコンストラクタ1
サブクラスのコンストラクタ

サブクラスであるBirdsクラスのコンストラクタにスーパークラスの呼び出し super(..) がありません。結果をみてみると「スーパークラスのコンストラクタ1」が表示されています。この処理はスーパークラスの引数がないコンストラクタの処理です。つまり、

サブクラスでスーパークラスのコンストラクタの呼び出しを記述しない場合は、自動的にスーパークラスの引数なしのコンストラクタが実行される。

サブクラスでスーパークラスの呼び出しを記述しない場合、スーパークラスには必ず引数なしのコンストラクタを準備する必要があります。もし記述しなければ呼び出し先がないためにエラーになります。しかしスーパークラスにコンストラクタの定義が1つもない場合は、デフォルトコンストラクタが呼び出されるのでエラーにはなりません。引数のあるコンストラクタのみをスーパークラスで定義するときは注意が必要です。

※デフォルトコンストラクタについては「コンストラクタ」記事を参考に


にほんブログ村 IT技術ブログ Webサイト構築へ
にほんブログ村
【WEBサイト構築・プログラムブログ】
ランキング参加中!よろしければ「クリック」お願いします。
にほんブログ村 IT技術ブログ プログラム・プログラマへ
にほんブログ村
2010 年 6 月 10 日 木曜日  【 カテゴリー: Javaの基本

コメントをどうぞ

※管理者による確認後に表示されます。表示までしばらくお待ちください。