コンストラクタ内ではtihs()とsuper()は同時に使用できない
Javaにおける初期化処理(コンストラクタ)では、this()やsuper()は1行目にしか記述できない。というルールがあります。
そのため、コンストラクタの2行目にthis()やsuper()を書いてしまうと以下のように2行目でコンパイルエラーが発生し、怒られてしまいます。
コンパイルエラー
コンストラクター呼び出しは、コンストラクター内の最初のステートメントである必要があります
super()が2行目だとNG
//コンストラクタ
public Child(int x, int y, int z) {
this(x,y);
super(z);//ここでコンパイルエラー。
}
this()が2行目だとNG
//コンストラクタ
public Child(int x, int y, int z) {
super(z);
this(x,y);//ここでコンパイルエラー。
}
本稿では、これを解決するサンプルコードを紹介します。
サンプルコード
変数x,yは自クラスのコンストラクタで初期化処理を行い、変数zを親クラスのコンストラクタで初期化処理を行うにはどうしたら良いですか?
この質問を解決するサンプルコードを作成します。
まず、スーパークラスを次のように作成します。
Parent.java
public class Parent {
int z;
public Parent(){
this.z = 100;
}
public Parent(int z) {
this.z = z;
}
}
続いて、サブクラスを次のように作成します。
Child.java
public class Child extends Parent {
//フィールド
int x;
int y;
//コンストラクタ
public Child(int x, int y, int z) {
this(z);
this.x = x;
this.y = y;
}
//コンストラクタ
public Child(int z) {
super(z);
}
//メイン処理
public static void main(String[] args) {
//インスタンス化
Child c = new Child(10,20,30);
//出力
System.out.println(c.x + ":" + c.y + ":" + c.z);
}
}
これを実行すると次の結果になります。
実行結果
10:20:30
解説
STEP.1
インスタンス生成
Childクラスの23行目でインスタンス化し、10,20,30の値を渡します。
STEP.2
コンストラクタ実行
Childクラスの8行目から定義しているコンストラクタが実行されます。
STEP.3
オーバーロードしたコンストラクタの呼び出し
Childクラスの9行目で変数zのみ、オーバーロードしたコンストラクタに渡します。
STEP.4
変数zの初期化
Childクラスの16行目にてスーパークラスのコンストラクタ呼び出し、Parentクラスの10行目で初期化されます。(z=30)
STEP.5
変数x,yの初期化
残りの変数x,yは、Childクラスの10-11行目にて初期化されます。(x=10,y=20)
STEP.6
完成
完成です。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!