デフォルトコンストラクタ

広告

コンストラクタを1つも定義していない場合、自動的にデフォルトコンストラクタと呼ばれるコンストラクタが作成されます。

クラス名(){
}

見て頂くと分かりますが、引数無しで中身が空のコンストラクタが作成されます。中身が空ですので何もしません。

では、何故このような空のコンストラクタが意味を持つのかと言いますと、コンストラクタは実行される前にまず自分自身の親クラスのコンストラクタを呼び出すようになっています。詳しくはクラスの継承の箇所でご説明しますが、コンストラクタの1行目には「super()」という親クラスのコンストラクタを呼び出す動作を行います。これはデフォルトのコンストラクタでも同じですので実際は下記のようになっています。

クラス名(){
  super();
}

何もしないようなデフォルトのコンストラクタですが、親クラスのコンストラクタを呼び出すという動作をしているため意味はあるわけです。

デフォルトコンストラクタの注意点

明示的にコンストラクタを1つでも記述した場合、デフォルトコンストラクタは作成されません。

引数無しのコンストラクタを記述したのであれば問題無いのですが、引数無しのコンストラクタを定義せず、引数があるコンストラクタだけ記述した場合にもデフォルトのコンストラクタは作成されないため、引数無しでそのクラスのオブジェクトを作成する事が出来なくなりますので注意して下さい。

サンプルで試してみましょう。例えば下記のようなプログラムであれば問題はありません。

class ctest11_1{
  public static void main(String args[]){
    Test test = new Test();
  }
}

class Test{

}

まさしく何もしないプログラムですが一応コンパイルは通りますし実行も出来ます。このプログラムがコンパイルエラーとならないのは、デフォルトのコンストラクタが自動的に作成されているためです。つまり下記のような感じです。

class ctest11_1{
  public static void main(String args[]){
    Test test = new Test();
  }
}

class Test{
  Test(){
  }
}

Testクラスのオブジェクトを作成する時、引数無しで作成していますが、引数無しのコンストラクタは自動で作成されるため問題はありませんでした。

次に引数があるようなコンストラクタを1つだけ定義した場合です。これは例えば引数無しと引数有りの場合があり、引数有りの場合だけ何か処理をしたいと考えた場合などです。

class ctest11_2{
  public static void main(String args[]){
    Test test = new Test();
  }
}

class Test{
  Test(int num){
  }
}

これはコンパイルエラーとなります。

C:¥jsample>javac ctest11_2.java
ctest11_2.java:4: シンボルを見つけられません。
シンボル: コンストラクタ Test()
場所    : Test の クラス
        Test test = new Test();
                    ^
エラー 1 個

C:¥jsample>

Testクラスのオブジェクトを引数無しで作成しようとしていますが、引数無しのコンストラクタが存在しないためエラーとなるわけです。コンストラクタが1つも無い場合にはデフォルトのコンストラクタが自動で作成されたのでよかったのですが、1つでもコンストラクタを自分で定義するとデフォルトコンストラクタは作成されないためエラーとなってしまいます。

このようなことにならないためにも、引数有りのコンストラクタを定義する場合には、引数無しのコンストラクタも(中身が例え空だったとしても)記述しておくようにして下さい。

class ctest11_3{
  public static void main(String args[]){
    Test test = new Test();
  }
}

class Test{
  Test(){
  }

  Test(int num){
  }
}

上記であればコンパイルエラーとはなりませんし実行も出来ます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)