「スッキリわかるJAVA入門」を「11章 継承」まで進めてて、
「あれ・・・コンストラクタってなんだっけ?」となったので、
自分用に「コンストラクタ」についてまとめます。
1 コンストラクタ(constructor)とは?
あるクラスがnewされた直後に自動的に実行されるメソッドのこと。
通常のメソッドは呼び出されない限りは実行されないが、コンストラクタはインスタンスが生まれた直後に自動実行される。
2 コンストラクタと見なされる条件
(1)メソッド名がクラス名と完全に等しい
(2)メソッド宣言に戻り値が記述されていない(voidも不可)
3 コンストラクタを使ってできること
インスタンスをnewする際にコンストラクタに引数を渡せば、newと同時にフィールドの値を初期化できる。
<Main.java>
public class Main{ public static void main(String[] args){ Person person1 = new Person("kumaGoro" , "Green"); System.out.println("I'm "+person1.name+"."); System.out.println("My favorite color is "+person1.favoColor+"."); } }
<Person.java>
public class Person{ String name; String favoColor; Person(String name, String favoColor){ this.name = name; this.favoColor = favoColor; } }
<実行結果>
4 コンストラクタのオーバーロード
引数を受け取るコンストラクタを定義すると、インスタンスを生成するとき、引数を指定しないとエラーになる。この問題は、引数を受け取らないコンストラクタも同時に定義することで解消される。複数のコンストラクタが定義されていた場合、インスタンス生成時に渡した引数の数、型等に対応するコンストラクタが動作することになる。
<Person.java>
public class Person{ String name; String favoColor; Person(String name, String favoColor){ this.name = name; this.favoColor = favoColor; } Person(String name){ this.name = name; } }
5 this()について
複数のコンストラクタを定義すると、重複する処理を記述することが多いが、コンストラクタの中から別のコンストラクタを呼び出す処理をすることで、重複部分を省略することができる。コンストラクタの中から別のコンストラクタを呼び出すには「this(引数);」と記述する。
<Person.java>
public class Person{ String name; String favoColor; Person(String name, String favoColor){ this.name = name; this.favoColor = favoColor; } Person(){ this("Anonymous ","unknown"); } }
6 コンストラクタの特例について
Javaでは、すべてのクラスはインスタンス化の際に、何らかのコンストラクタを実行することになっている。つまり、最低でも1つ以上のコンストラクタを持っていなければならない。しかし、コンストラクタが全く定義されていない場合は、コンパイル時に引数、処理内容が空白の「デフォルトコンストラクタ」が自動的に追加されるので、コンストラクタのないクラスでもエラーを出すことなく実行できる。