HOME> Javaアプリケーション講座>継承>コンストラクタの呼び出し

コンストラクタの呼び出し

まず、最初にサンプルプログラムを見ていきましょう

サンプルプログラム(Sample56.java)

class Sample56{
    public static void main(String args[]){

  Sub56 obj = new Sub56();

     }

} 

class Super56{

    //スーパークラスの引数のないコンストラクタ
     Super56(){

     System.out.println("これは、スーパークラスのコンストラクタです");

   }
}

class Sub56 extends Super56{

   //サブクラスの引数のないコンストラクタ
    Sub56(){

    System.out.println("これは、サブクラスのコンストラクタです");

    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

【簡単更新&こだわりデザイン!】 100% ホームページ プチ
こんなに簡単!店舗向けホームページがすぐ始められる「グーペ」
レンタルサーバーheteml


コンパイル・実行してみます。

このプログラムはスーパークラス、サブクラスで共に引数のないコンストラクタを
定義しています。そして、mainメソッド内でサブクラスのオブジェクトを作成して
コンストラクタを呼び出しています。
結果を見てください最初にスーパークラスのコンストラクタが呼び出されてます。

このように何も指定しないと、サブクラスのコンストラクタの先頭で、
スーパークラスの引数のないコンストラクタが最初に呼び出されます。

あくまでもスーパークラスの引数のないコンストラクタが呼び出されます。

では引き続き次のサンプルプログラムを見ていきます。

サンプルプログラム(Sample56_1.java)

class Sample56_1{
    public static void main(String args[]){


   Sub56_1 obj = new Sub56_1();
   Sub56_1 obj1 = new Sub56_1(10);

     }

} 

class Super56_1{

    //スーパークラスの引数のないコンストラクタ
     Super56_1(){

     System.out.println("これは、スーパークラスのコンストラクタです");

   }
   //スーパークラスの引数のあるコンストラクタです");
    Super56_1(int x){

    System.out.println("これは、引数のあるスーパークラスです");
    System.out.println("int x =" + x);

   }
}
class Sub56_1 extends Super56_1{

   //サブクラスの引数のないコンストラクタ
    Sub56_1(){

    System.out.println("これは、サブクラスのコンストラクタです");

   }
   //サブクラスの引数のあるコンストラクタ
   Sub56_1(int y){
   System.out.println("これは、引数のあるサブクラスのコンストラクタです");
   System.out.println("int y =" + y);

  }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

比較.comで簡単スクール選び!資格と講座の資料を無料で一括請求
技術系の通信教育講座ならJTEX


コンパイル・実行してみます。

このプログラムを見れば一目瞭然ですね。
ここでは、引数のないコンストラクタと引数のあるコンストラクタを定義しています。

それぞれのコンストラクタ内でスーパークラスの引数のないコンストラクタ が呼び出されています。

続いてサンプルプログラムを見いていきます。

サンプルプログラム(Sample56_2.java)

class Sample56_2{
    public static void main(String args[]){

   Sub56_2 obj = new Sub56_2();

     }

} 

class Super56_2{

    //コンストラクタを定義しない
     
}
class Sub56_2 extends Super56_2{

   //サブクラスの引数のないコンストラクタ
    Sub56_2(){

    System.out.println("これは、サブクラスのコンストラクタです");

    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

コンパイル・実行します。

今度はスーパークラスにはコンストラクタを定義しませんでした。
しかしこれもコンパイル・実行されます。
最初に説明したのを思い出してください。

コンストラクタをひとつも定義しなければデフォルトコンストラクタが自動に作成されました。
つまりここでも引数のないスーパークラスはちゃんと呼ばれていることになります。

では、これはどうでしょうか?

サンプルプログラム(Sample56_3.java)

class Sample56_3{
    public static void main(String args[]){


   Sub56_3 obj = new Sub56_3();
   Sub56_3 obj1 = new Sub56_3(10);

     }

} 

class Super56_3{

  //引数のないコンストラクタは定義しません

    
   //スーパークラスの引数のあるコンストラクタです");

    Super56_3(int x){

    System.out.println("これは、引数のあるスーパークラスです");
    System.out.println("int x =" + x);

   }
}
class Sub56_3 extends Super56_3{ //サブクラスの引数のないコンストラクタ Sub56_3(){ System.out.println("これは、サブクラスのコンストラクタです"); } //サブクラスの引数のあるコンストラクタ Sub56_3(int y){ System.out.println("これは、引数のあるサブクラスのコンストラクタです"); System.out.println("int y =" + y); } }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行します。

今度は、コンパイルエラーになります。

これは、スーパークラスでは引数のあるコンストラクタが既に定義されています。
したがってデフォルトコンストラクタは作成されません。

最初に説明した通りサブクラスのコンストラクタの先頭でスーパークラスの引数の
ないコンストラクタが呼び出されますが、スーパークラスには引数のないコンストラクタは
存在しません。したがってこのようなエラーが出力されます。

では、エラーをしないようにするにはどうしたらいいのでしょうか?

次のプログラムで確認します。

サンプルプログラム(Sample56_4.java)

class Sample56_4{
    public static void main(String args[]){


 Sub56_4 obj = new Sub56_4();
   Sub56_4 obj1 = new Sub56_4(10);

     }

} 

class Super56_4{

  //空のコンストラクタ
    Super56_4(){}

   //スーパークラスの引数のあるコンストラクタです");
    Super56_4(int x){

    System.out.println("これは、引数のあるスーパークラスです");
    System.out.println("int x =" + x);

   }
}
class Sub56_4 extends Super56_4{

   //サブクラスの引数のないコンストラクタ
    Sub56_4(){

    System.out.println("これは、サブクラスのコンストラクタです");

   }
   //サブクラスの引数のあるコンストラクタ
   Sub56_4(int y){

   System.out.println("これは、引数のあるサブクラスのコンストラクタです");
   System.out.println("int y =" + y);

    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

このようにとりあえずスーパークラスにも何も処理をされていない空の
コンストラクタを作成してやればいいのです。

ページのトップへ戻る