コンストラクタについてわかった気でいたけれど、すっかり忘れていたので調べ直すことにしました。
コンストラクタとは
コンストラクタはインスタンスが生成されるときに自動的に実行される特殊なメソッドです。
コンストラクタには以下の条件があります。
- コンストラクタ名はクラス名と同じでなければならない(大文字小文字含む)
- コンストラクタは戻り値を返さない(戻り値はしていできないためvoidの記述もありません)
- newと一緒にしか使用できない(インスタンス生成時以外呼び出せない)
サンプルコードを見ながらコンストラクタの理解を深めていきましょう。
コンストラクタを使ったサンプルコード
コンストラクタの動きの確認をしていきましょう。
環境が整っていない場合はDokojavaで実行してみてください。
サンプルコード 暗黙的なコンストラクタ
public class Main {
public static void main(String[] args) throws Exception {
// コンストラクタを呼び出し
Station s = new Station();
System.out.println(s.name);
}
}
class Station{
String name = “駅”;
}
Stationクラスにコンストラクタは明示的に書かれていませんが、クラスには必ず1つ以上コンストラクタが定義されている必要があります。そのためクラスに1つもコンストラクタが定義されていない場合はデフォルトコンストラクタ(引数のないコンストラクタ)が実行されています。
サンプルコード 引数のあるコンストラクタのみの場合
前述のサンプルコードでクラスに1つもコンストラクタがない場合はデフォルトコンストラクタが呼び出されると書きましたが、引数のあるコンストラクタのみ記述するとどうなるのかというサンプルコードです。
public class Main {
public static void main(String[] args) throws Exception {
// コンストラクタを呼び出し(エラー)
Station s = new Station();
}
}
class Station{
String name;
//コンストラクタを定義(明示的)
public Station(String name){
this.name = name;
}
}
1つでもコンストラクタがあるとデフォルトコンストラクタは実行されないのでエラーとなります。
忘れないように気をつけたいですね。
サンプルコード コンストラクタをオーバーロード
上記のように引数ありのコンストラクタを記述する場合は引数なしのメソッドも書く必要があります。そのためメソッドをオーバーロードしてあげれば解決します。
public class Main {
public static void main(String[] args) throws Exception {
// コンストラクタを呼び出し
Station s = new Station();
}
}
class Station{
String name;
//コンストラクタを定義 引数なし
public Station(){
this.name = “デフォルト駅”;
}
//コンストラクタを定義 引数あり
public Station(String name){
this.name = name;
}
}
メソッド名が同じでも引数の型や数が異なる場合、複数メソッドを書くことができます。そのことをオーバーロードといいます。
サンプルコード コンストラクタからコンストラクタメソッドの呼び出し
this(引数)を使ってオーバーロードしたコンストラクタを呼び出します。
public class Main {
public static void main(String[] args) throws Exception {
// コンストラクタを呼び出し
Station s = new Station();
}
}
class Station{
String name;
//コンストラクタを定義 引数なし
public Station(){
this(“ダミー駅”);
}
//コンストラクタを定義 引数あり
public Station(String name){
this.name = name;
System.out.println(name+”に到着しました。”);
}
}
this.Station()のようにドットを使わないように気をつけましょう。
サンプルコード コンストラクタからコンストラクタメソッドの呼び出す時の注意
thisを使う際は、最初に記述しなければコンパイルエラーとなります。
public class Main {
public static void main(String[] args) throws Exception {
// コンストラクタを呼び出し
Station s = new Station();
}
}
class Station{
String name;
//コンストラクタを定義 引数なし
public Station(){
System.out.println(“thisははじめに書かなければいけない”);
this(“ダミー駅”); // エラー
}
//コンストラクタを定義 引数あり
public Station(String name){
this.name = name;
System.out.println(name+”に到着しました。”);
}
}
おわり
超初心者である私はコンストラクタとメソッドの違いで困惑しましたが、コンストラクタはメソッドだったんですね。