コンストラクタとは
クラスで指定できる、インスタンス化と同時に実行できるメソッドのこと。定義方法はメソッドと似ているが、以下のルールに従って定義する。
- 名前はクラス名と同じ
- 戻り値は持たない(戻り値の型宣言もしない)
- 引数を受け取ることができる
public class A{
A(){
System.out.println("A");
}
}
以下のようにインスタンス化したタイミングでコンストラクタが呼び出されることを確認できる。
public class Main {
public static void main(String[] args) {
A a = new A();
}
}
結果
A
継承時のコンストラクタの呼ぶ順番について
以下のようにAを継承したBを用意する。
public class B extends A{
B(){
System.out.println("B");
}
}
そしてMainクラスでBクラスのインスタンス化を実施する。
public class Main {
public static void main(String[] args) {
B b = new B();
}
}
結果
A
B
このようにABという順番で呼び出された。継承している場合はスーパークラスのコンストラクタが先に呼び出され、次にサブクラスのコンストラクタが呼び出される。なお、A型参照でBクラスのインスタンス化を行った場合も同様の結果になる。
public class Main {
public static void main(String[] args) {
A a = new B();
}
}
結果
A
B
コンストラクタから自クラスのコンストラクタを呼ぶ方法
自クラスのコンストラクタはthisで呼ぶことができる。
public class A{
A(){
System.out.println("A");
}
A(int num){
this();
System.out.println("this" + num);
}
}
public class Main {
public static void main(String[] args) {
A a = new A(1);
}
}
結果
A
this1
なおここで注意したいのがthis()の位置だ。試しにthis()の位置を変えてみよう。
public class A{
A(){
System.out.println("A");
}
A(int num){
System.out.println("this" + num);
this();
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
コンストラクター呼び出しは、コンストラクター内の最初のステートメントである必要があります
at A.<init>(A.java:7)
at Main.main(Main.java:3)
このようにエラーが発生した。this()はコンストラクタの中で1番最初に呼び出す必要がある。
コンストラクタから親クラスのコンストラクタを呼ぶ方法
親クラスのコンストラクタはsuperで呼ぶことができる。
public class B extends A{
B(){
super();
System.out.println("B");
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
}
}
結果
A
B
なおここでもsuperの位置は重要だ。試しにsuper()の位置を変えてみよう。
public class B extends A{
B(){
System.out.println("B");
super();
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
コンストラクター呼び出しは、コンストラクター内の最初のステートメントである必要があります
at B.<init>(B.java:4)
at Main.main(Main.java:3)
このようにsuper()もコンストラクタの中で1番最初に呼び出す必要がある。なおthisも同じくコンストラクタの中で1番最初に呼び出す必要があるため、同一コンストラクタ内でthisとsuperを呼び出すことは不可能。
もしどちらも呼び出したい場合は別々のコンストラクタ内でthisとsuperを呼び出す必要がある。
public class B extends A{
B(){
super();
System.out.println("B");
}
B(int num){
this();
}
}
まとめ
- コンストラクタはインスタンス化と同時に実行できるメソッドであり、①名前はクラス名と同じ②戻り値は持たない③引数を受け取れる、という特徴がある
- スーパークラスのコンストラクタが先に呼び出される
- 自クラスのコンストラクタはthisを使って呼べる。なお、thisはコンストラクタの中で1番に呼び出す必要がある
- 親クラスのコンストラクタはsuperを使って呼べる。なお、superはコンストラクタの中で1番に呼び出す必要がある