LoginSignup
2
2

More than 3 years have passed since last update.

Javaのポリモーフィズム super()について

Posted at

ポリモーフィズムを改めて調べたのでまとめておく
今回は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);
    }
}
山田です。
学生です。
山田
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2