Java Bronzeのコンストラクタ纏め

Java Bronzeのコンストラクタ纏め

Javaのコンストラクタを勉強する機会があったので纏めです。

オブジェクトをnewするとデフォルトコンストラクタが呼ばれます。デフォルトコンストラクタは引数なしコンストラクタのことを言います。

class Emp{
Emp() { // デフォルトコンストラクタ
System.out.println("初期化する");
}
}
public class Main {
public static void main(String[] args) {
Emp emp = new Emp();
}
}

view raw
constructor
hosted with ❤ by GitHub

デフォルトコンストラクタはnewすると勝手に生成されるので、省略可能です。

デフォルトコンストラクタを省略して、引数ありコンストラクタを定義してみます。

class Emp{
private String name;
Emp(String name) { // 引数ありコンストラクタ
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Emp emp = new Emp(); // ここでコンパイルエラー
}
}

view raw
constructor
hosted with ❤ by GitHub

引数ありコンストラクタを書くと、デフォルトコンストラクタは生成されなくなってしまい、上記はコンパイルエラーとなってしまいます。

この場合、デフォルトコンストラクタは明示的に定義する必要があります。この辺、Java Bronzeの問題で出てきました。

this()とsuper()

this()は自クラスのコンストラクタを呼び出すことができます。super()は親クラスのコンストラクタを呼び出すことができます。

this()とsuper()を同時に呼ぶことはできません。また、コンストラクタ内の先頭行に書かなくてはいけません。先頭行に書く、というのも問題で出てきました。

class Emp{
private String name;
private int age;
Emp(String name) {
this(10); // thisはコンストラクタの先頭行に書く必要がある
this.name = name;
}
Emp(int age) {// this(10);でこのコンストラクタが呼ばれる
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Emp emp = new Emp("takahashi");
System.out.println(emp);
}
}

view raw
constructor
hosted with ❤ by GitHub

サブクラスのコンストラクタ内の先頭行ではsuper();が暗黙的に呼ばれる

サブクラスChildとスーパークラスParentがあるとします。この場合、Childクラスのコンストラクタ内の先頭行でsuper();が呼ばれます。

super();はスーパークラスのデフォルトコンストラクタになります。この際、スーパークラスに引数ありコンストラクタを記述していると、デフォルトコンストラクタは生成されなくなってしまうため、コンパイルエラーとなってしまいますので注意です。Java Bronzeはこのようなひっかけ問題が多かったです。

class Parent {
private String name;
Parent(String name) {// 引数ありコンストラクタを書くとデフォルトコンストラクタは生成されない
this.name = name;
}
}
class Child extends Parent{
private int age;
Child(int age) {
// super();が実際は書かれているが省略されているためコンパイルエラー
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Child emp = new Child(20);
System.out.println(emp);
}
}

view raw
constructor
hosted with ❤ by GitHub

サブクラスのコンストラクタが呼ばれるのですが、先頭行にsuper();となるので、まずはスーパークラスのデフォルトコンストラクタが必ず呼ばれるわけです。

子クラスから親クラスのメソッドを呼び出したりする場合は、super.メソッド名()となり、super()ではない点も注意です。

ちなみに、this.メソッド名()でも親クラスのメソッド名が呼び出せます。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA