Javaのsuperとは?親クラスのコンストラクタやメソッドを呼び出す書き方

本記事は、Schooの「Java入門 初級【2026年版】」第7回「継承とインターフェース」を学ぶ前後に、Javaの super の考え方を整理したい方向けのステップアップ学習記事です。
ただし、Schooを受講していない方でも、クラス、コンストラクタ、継承の基本を学んだあとに読み進められる内容にしています。
Schoo コースページ:Java入門 初級【2026年版】
super は、子クラスから親クラス側のコンストラクタやメソッドを呼び出すために使うキーワードです。継承したクラスを読むときは、this が自分、super が親を指す、と考えると整理しやすくなります。
superは親クラス側を指すキーワード
継承では、子クラスが親クラスの機能を利用できます。その中で、親クラス側の処理を明示して呼び出したいときに super を使います。
public class Child extends Parent {
private String givenName;
public Child(String familyName, String givenName) {
super(familyName);
this.givenName = givenName;
}
}
この例では、Child が Parent を継承しています。super(familyName); は、親クラス Parent のコンストラクタを呼び出す書き方です。
親へ渡す
super(familyName); は、親クラス Parent のコンストラクタを呼び出します。親クラス側で持つ familyName の初期化を任せるための書き方です。
super(…) は親クラスのコンストラクタを呼び出す
親クラスにコンストラクタがある場合、子クラスのコンストラクタから親クラス側の初期化を呼び出す必要があります。
public class Parent {
private String familyName;
public Parent(String familyName) {
this.familyName = familyName;
}
}
Parent は、コンストラクタで familyName を受け取り、親クラス側のフィールドにセットしています。
public class Child extends Parent {
private String givenName;
public Child(String familyName, String givenName) {
super(familyName);
this.givenName = givenName;
}
}
Child のコンストラクタでは、まず super(familyName); で親クラス側の初期化を行い、そのあとで this.givenName = givenName; によって子クラス側のフィールドを初期化しています。
thisは自分、superは親
this と super は似て見えますが、指しているものが違います。this は今いるクラス自身、super は親クラス側を指します。
this.givenName は、今いる Child クラス自身のフィールドを指します。super(...) は、親クラス Parent 側のコンストラクタを呼び出します。this と super は、どちらも継承やコンストラクタを読むときに重要なキーワードです。super.メソッド名() で親のメソッドを呼び出す
super は、親クラスのメソッドを呼び出すときにも使えます。特に、子クラスで同じ名前のメソッドを上書きしている場合に、親クラス側の処理も使いたいときに便利です。
public class ParentMessage {
public void showMessage() {
System.out.println("Parentの処理です。");
}
}
public class ChildMessage extends ParentMessage {
@Override
public void showMessage() {
super.showMessage();
System.out.println("Childの処理です。");
}
}
super.showMessage(); は、親クラス ParentMessage の showMessage を呼び出しています。そのあとで、子クラス側の処理を追加しています。
super.showMessage(); と書くと、子クラスで同じ名前のメソッドを持っていても、親クラス側の showMessage を呼び出せます。
super はコンストラクタだけでなく、親クラスのメソッドを明示して呼び出すときにも使います。この例ではsuper(…)をコンストラクタの先頭に書く
この記事では、super(...) をコンストラクタの先頭に書き、親クラス側を初期化してから子クラスのフィールドへ値を設定する形で説明します。Java 21などでは先頭に書く必要があります。Java 25では一定の制約のもとで前に処理を書けますが、ここでは基本の形を使います。
public Child(String familyName, String givenName) {
super(familyName); // 先に親クラス側を初期化
this.givenName = givenName; // そのあと子クラス側を初期化
}
この例の Parent には引数付きコンストラクタしかないため、super(familyName) を明示して値を渡します。一方、親クラスに呼び出し可能な引数なしコンストラクタがあり、子クラスで super(...) も this(...) も書かない場合は、super() が暗黙に補われます。親クラスの初期化は行われますが、常に自分で super() を書く必要があるわけではありません。
確認問題
super(familyName);は何を呼び出している書き方ですか。this.givenNameとsuper(familyName)は、それぞれどちら側を指していますか。super.showMessage();はどのクラスのshowMessageを呼び出しますか。
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
あわせて読みたい関連記事
まとめ
super は、子クラスから親クラス側を指すキーワードです。super(...) は親クラスのコンストラクタを呼び出し、super.メソッド名() は親クラスのメソッドを呼び出します。this は自分、super は親、と分けて考えると、継承したクラスの初期化やメソッド呼び出しを読み取りやすくなります。