Java Bronzeのコンストラクタ纏め
Javaのコンストラクタを勉強する機会があったので纏めです。
オブジェクトをnewするとデフォルトコンストラクタが呼ばれます。デフォルトコンストラクタは引数なしコンストラクタのことを言います。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Emp{ | |
Emp() { // デフォルトコンストラクタ | |
System.out.println("初期化する"); | |
} | |
} | |
public class Main { | |
public static void main(String[] args) { | |
Emp emp = new Emp(); | |
} | |
} |
デフォルトコンストラクタはnewすると勝手に生成されるので、省略可能です。
デフォルトコンストラクタを省略して、引数ありコンストラクタを定義してみます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Emp{ | |
private String name; | |
Emp(String name) { // 引数ありコンストラクタ | |
this.name = name; | |
} | |
} | |
public class Main { | |
public static void main(String[] args) { | |
Emp emp = new Emp(); // ここでコンパイルエラー | |
} | |
} |
引数ありコンストラクタを書くと、デフォルトコンストラクタは生成されなくなってしまい、上記はコンパイルエラーとなってしまいます。
この場合、デフォルトコンストラクタは明示的に定義する必要があります。この辺、Java Bronzeの問題で出てきました。
this()とsuper()
this()は自クラスのコンストラクタを呼び出すことができます。super()は親クラスのコンストラクタを呼び出すことができます。
this()とsuper()を同時に呼ぶことはできません。また、コンストラクタ内の先頭行に書かなくてはいけません。先頭行に書く、というのも問題で出てきました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
サブクラスのコンストラクタ内の先頭行ではsuper();が暗黙的に呼ばれる
サブクラスChildとスーパークラスParentがあるとします。この場合、Childクラスのコンストラクタ内の先頭行でsuper();が呼ばれます。
super();はスーパークラスのデフォルトコンストラクタになります。この際、スーパークラスに引数ありコンストラクタを記述していると、デフォルトコンストラクタは生成されなくなってしまうため、コンパイルエラーとなってしまいますので注意です。Java Bronzeはこのようなひっかけ問題が多かったです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
サブクラスのコンストラクタが呼ばれるのですが、先頭行にsuper();となるので、まずはスーパークラスのデフォルトコンストラクタが必ず呼ばれるわけです。
子クラスから親クラスのメソッドを呼び出したりする場合は、super.メソッド名()となり、super()ではない点も注意です。
ちなみに、this.メソッド名()でも親クラスのメソッド名が呼び出せます。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント