コンストラクタ(Java)
Javaとは
Javaは、1995年にリリースされたプログラミング言語およびコンピューティング・プラットフォームです。Javaは多くの現場で使われており、汎用的でOSに依存せず、「一度プログラムを書けば、どこでも実行できる」という特徴があることが理由で、とても人気のあるプログラミング言語です。プログラム言語には動くマシンが限定されてしまうケースが多いのですが、JavaはWindowsやMacOS、Linux、UNIXなど様々なマシンで動かすことができます。作成したソフトが動く環境を考えるというのはプログラマーにとって大変な問題ですので、どこでも動作して、OSに依存しないという点は重要なポイントになります。
コンストラクタについて
コンストラクタは、Javaに限らずオブジェクト指向のプログラミング言語で登場する用語のひとつです。
今回扱うJavaにおいて、「クラス」とはプログラムを実行するための処理をまとめたものです。
クラスの処理の中にはメンバ変数やメソッドがあります。
Javaのようなオブジェクト指向のプログラミング言語では、クラスの中の処理を実行するために、そのクラスの「インスタンス」を生成する必要があります。クラスからインスタンスを生成する際はSample s = new Sample( ); というふうに「new」を利用します。
通常のメソッドは呼ばれないと動かないものですが、コンストラクタは、クラスのインスタンスを生成する時に自動的に実行されるメソッドです。主にそのクラスのメンバ変数を初期化するときに使用します。
コンストラクタの構文について
先に、コンストラクタを使用する際の注意点を2つ挙げておきます。
1、クラス名とメソッド名が同じ名前であること。
2、メソッド宣言に戻り値を書かないこと。(voidもだめ)
※値を返すことができないので、return と書くとコンパイルエラーになります。
コンストラクタを使いこなすことで、より綺麗なコードを記述出来ますのでしっかりと学習していきましょう。
public class Dog { (⇦同じ名前にする)
Dog( ) { (⇦同じ名前にする・戻り値なし)
System.out.println("引数なしです")
}
}
public class Dog {
String name; (⇦メンバ変数)
int age; (⇦メンバ変数)
Dog(String name) { (⇦引数ありのコンストラクタ)
this.name = name; (⇦引数として文字列を受け取る)
this.age = 5; (⇦メンバ変数に値を設定)
}
}
public class Main{
public static void main (String[ ] args) {
Dog d = new Dog("ポチ");(⇦コンストラクタに「ポチ」が渡される)
System.out.println(d.name); (⇦ポチと表示)
System.out.println(d.age); (⇦5と表示)
}
}
デフォルトコンストラクタの注意点
ただし、クラスに1つもコンストラクタを定義していない場合に限って、引数無し・中身の処理無しの「デフォルトコンストラクタ」と呼ばれるコンストラクタが作成されます。
Dog( ){ }
このコンストラクタは中身が空ですので何もしません。コンストラクタが書かれていないクラスはデフォルトコンストラクタが自動的に定義されており、new Dog( ); によるインスタンス化が可能になります。
そして、明示的に1つでもコンストラクタを記述した場合、デフォルトコンストラクタは作成されません。②の場合であると、new Dog( );という呼び出しをするとコンパイルエラーになってしまいます。なので①のように引数無しのコンストラクタを書いておく必要があります。
コンストラクタのオーバーロード
クラスにはいくつでもコンストラクタを作れます。コンストラクタの引数を変えればオーバーロード出来るということです。例えば…
public class Dog {
Dog( ){
this.name = "ゴン太";
this.age = 5;
}
Dog(String name) { (⇦引数ありのコンストラクタ)
this.name = name;
this.age = 5;
}
Dog(String name, int age){ (⇦引数2つのコンストラクタ)
this.name = name;
this.age = age;
}
他のコンストラクタを呼び出す
2つ以上のコンストラクタを定義していると重複する処理の記述も出てくるでしょう。④で言う所の、Dog( ){...}とDog(String name){...}のthis age = 5;という部分です。どちらも同じ数字が入っています。もし変更することになったら、手間が増えます。もっと長いプログラムなら、ミスの原因にもつながります。そのような場合に備えて、コンストラクタの中から別のコンストラクタを呼び出す方法も載せておきます。
public class Dog {
Dog( ) { (⇦コンストラクタ⑴)
this("ゴン太"); (⇦コンストラクタ⑵を呼び出す!)
}
Dog(String name) { (⇦コンストラクタ⑵)
this.name = name;
this.age = 5;
}
※「this.メンバ名」は自分自身のインスタンスを表すもので、「this(引数)」は同一クラスの別コンストラクタを呼び出すものです。
また「this.クラス名(引数)」という記述はできません。
最後に
このようにコンストラクタはとても便利で、プログラムの設計ミスの確率を下げるためには覚えておかなければならない内容です。他にも様々な決まりごともあります。今回は一部しか紹介できませんでしたが、とても面白いところなので、ぜひとも勉強してみてください。