ポリモーフィズムを改めて調べたのでまとめておく
今回はsuper()を深ぼって理解したい
対象
- なんとなくでJavaを書いている人
super()とは、親クラスのコンストラクタである
結論である
具体例で試していこうと思う
具体例
Person.java
public class Person {
Person() {
System.out.println("人間です。" + );
}
}
Student.java
public class Student extends Person {
Student() {
System.out.println("学生です。");
}
}
Main.java
public class Main {
public static void main() {
new Student();
}
}
人間です。
学生です。
解説
Studentクラスのコンストラクタに「人間です。」を出力する記述をしていないが表示される。
つまり、Personを継承したStudentクラスのコンストラクタは
Person.java
public class Student extends Person {
Student() {
super();
System.out.println("学生です。");
}
}
このようになっている。
(実際になっているわけではないが明示的に書くとこんな感じ。継承クラスのインスタンスを生成すると親クラスのコンストラクタが自動で呼ばれる)
このsuper()こそが親クラスのコンストラクタ。
引数を追加
次に親クラスのコンストラクタに引数を追加する
Person.java
public class Person {
private String name;
Person(String name) {
this.name = name;
System.out.println(name + "です。");
}
}
Main.java
public class Main {
public static void main() {
new Student();
}
}
はい。コンパイルエラーです。Personクラスのコンストラクタが引数を要求しているからです。
こういう場合はStudentクラスでsuper()に引数を入れて呼んであげる必要があります。
Student.java
public class Student extends Person {
Student(String name) {
super(name);
System.out.println("学生です。");
}
}
Main.java
public class Main {
public static void main() {
new Student("山田");
}
}
山田です。
学生です。
StudentはPersonを継承しているので、nameフィールドも持っています
Main.java
public class Main {
public static void main() {
Student student = new Student("山田");
System.out.println(student.name);
}
}
山田です。
学生です。
山田