1. Child.greet() が super.greet() + " from child" を返し、結果が "Hello from child" になる
コース一覧
Java 中級:コレクション・Stream・例外処理
super で親を呼ぶ

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

super で親を呼ぶ

親と同じ名前を書いた瞬間、親の処理が消える

親のメソッドを子で同じ名前にして書き直すと、親の中身は呼ばれなくなります。ところが実際にやりたいのは「全部を置き換える」ではなく「親の結果に一言足す」であることが多いはずです。

しかも、子の中で親と同じ名前をそのまま書くと、呼ばれるのは自分自身です。

Java

class MonthlyReport extends Report { public String title() { return "【" + title() + "】"; // 自分を呼び続けて StackOverflowError } }

この無限再帰を避けて「親のほうの実装」を名指しするキーワードが super です。

super.メソッド名() で親の実装を名指しする

Java

class Report { public String title() { return "売上レポート"; } } class MonthlyReport extends Report { @Override public String title() { return "【" + super.title() + "】"; } }

super.title() の行で制御が Report 側へ移り、"売上レポート" が返ってきます。それを子の側で加工して返す、という流れです。super は「親としての自分」を指すので、書き方は普通のメソッド呼び出しと変わりません。引数もそのまま渡せます。

さかのぼれるのは 1 段だけです。super.super.title() のように祖父母を直接呼ぶ書き方は Java にはありません。

super(...) はコンストラクタの 1 行目にしか書けない

もう 1 つの使い道が、親のコンストラクタ呼び出しです。

Java

class Report { protected final String owner; public Report(String owner) { this.owner = owner; } } class MonthlyReport extends Report { private final int month; public MonthlyReport(String owner, int month) { super(owner); // ここより上には何も置けない this.month = month; } }

super(owner) を書かないと、コンパイラは引数なしの super() を勝手に補おうとします。親に引数なしコンストラクタが無ければ、そこでコンパイルエラーです。前にログを 1 行入れたくなっても、super(...) より上に文は置けません。どうしても前処理したいときは static メソッドに切り出して、super(prepare(owner)) のように引数の中で呼びます。

解説

Android の onCreate で super.onCreate(...) を最初に書くのも同じ理屈です。親の初期化を済ませないうちに自分の処理を始めると、土台の無いところで動くことになります。

やってみよう

describeChild() を完成させてください。

  1. Parent クラスに public String greet() を用意し、"Hello" を返すようにする
  2. Parent を継承した Child を作り、greet() を同じ名前で定義し直す
  3. Child 側の greet() では親の実装を呼び、その結果のうしろに " from child" をつなげて返す
  4. describeChild() は Child のインスタンスを作り、greet() の結果を返す

最終的な戻り値は "Hello from child" です。" from child" の先頭にある半角スペースを落とすと一致しません。Child の中で "Hello from child" を直接返しても値は合ってしまいますが、それでは親を呼んでいないので、必ず親の実装を経由してください。

要件

  1. Child クラスは Parent を extends で継承すること
  2. Child.greet() は super.greet() を呼び、その結果に " from child" を連結して返すこと
  3. Solution.describeChild() は new Child().greet() の結果を return し、最終的に "Hello from child" を返すこと

入出力例

describeChild() → "Hello from child"

ヒント

親メソッドを呼ぶには `super.greet()` と書きます。`greet()` のままだと自分自身を呼んで `StackOverflowError` になります

オーバーライドであることを明示するため `@Override` を付けると、シグネチャがズレたときにコンパイラが教えてくれます

戻り値は `super.greet() + " from child"` です。`" from child"` の先頭の半角スペースを忘れると `"Hellofrom child"` になってしまいます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • メソッドのオーバーライド

    親クラスのメソッドを子クラスで上書きするオーバーライドの仕組みを学び、Shape を継承した Circle で area() を再定義してみよう。

  • abstract で抽象クラス

    Java の `abstract` キーワードで抽象クラスと抽象メソッドを定義し、`Shape` を継承した `Triangle` で三角形の面積を求めるコードを書いてみよう。

  • interface で契約を定義

    Java の interface を使って「契約」だけを定義し、implements で複数のクラスに同じ振る舞いを約束させる方法を学ぼう。

  • default メソッド

    Java 8 で導入された interface の default メソッドの使い方と、後方互換性を保ちながら共通実装を提供する仕組みを学び、英語版あいさつメソッドを書いてみよう。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • メソッドクラスに属する関数
  • 再帰関数が自分自身を呼び出す処理パターン
  • 引数位置引数=順番で渡す。
  • コンストラクタインスタンス生成時の初期化処理
  • コンパイルソースをバイトコードへ変換する処理
  • クラスデータと振る舞いを束ねる単位
  • 継承親クラスの機能を子クラスへ引き継ぐ仕組み
main.java
学習モード
エディタを読み込んでいます

メモ

super で親を呼ぶ

⌘S で保存