1. 半径 1 の円の面積は (int)(1*1*3.14) = 3
  2. 半径 10 の円の面積は (int)(10*10*3.14) = 314
  3. 半径 0 の円の面積は 0
  4. 半径 5 の円の面積は (int)(5*5*3.14) = 78
コース一覧
Java 中級:コレクション・Stream・例外処理
メソッドのオーバーライド

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分

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

親のメソッドが、子には合わない

親クラスに共通の fee() を書いておいたのに、速達だけは計算式が違う。かといって子に expressFee() という別名を用意すると、呼ぶ側が「これは速達だから別のメソッドを呼ぼう」と種類を意識することになります。

名前は親と同じままにして、中身だけ子で入れ替える。これが オーバーライド です。

シグネチャを完全に一致させ、@Override を付ける

子クラスで、親と 戻り値の型・メソッド名・引数 がまったく同じメソッドを書くだけです。

Java

class Shipping { public int fee() { return 500; } } class ExpressShipping extends Shipping { @Override public int fee() { return 500 + 300; } }

new ExpressShipping().fee() は 800 を返します。親の fee() は隠れて、子の実装が選ばれます。

大事なのは「まったく同じ」の部分です。引数を 1 つ足したり型を変えたりすると、Java はそれを別のメソッドと見なします。親の fee() はそのまま生き残り、子には誰も呼ばないメソッドが 1 つ増えるだけ。呼んでも親の値が返ってきて、原因の分かりにくいバグになります。

@Override は「これは親のメソッドの差し替えのつもりだ」とコンパイラに伝える印です。付けても動きは変わりませんが、親に一致するメソッドが無ければコンパイルエラーになります。

fee を free とタイプミスしたとき、付けていなければ黙って通り、実行してから「なぜか元の値が返る」と悩むことになります。付けていれば method does not override or implement a method from a supertype で即座に止まります。差し替えるつもりのメソッドには必ず付けてください。

そのほかの決まりは次の 2 つです。

  • アクセス修飾子は親と同じか、より広くだけ。親が public なのに子で protected にするとエラーになる
  • static や final が付いた親のメソッドは差し替えられない

親の型で受けても、子の実装が動く

差し替えが効くのは、変数の型ではなく 実際に入っているインスタンス を見て呼び先が決まるからです。

Java

Shipping s = new ExpressShipping(); int f = s.fee(); // 800。Shipping.fee ではない

変数 s の型は Shipping ですが、中身は ExpressShipping なので、実行時に子の fee() が選ばれます。おかげで呼ぶ側は、相手が速達かどうかを知らないまま fee() と書けばよくなります。

やってみよう

circleArea(int radius) を完成させてください。

  1. 親クラス Shape に public int area() を用意する。中身は 0 を返すだけで構いません
  2. Shape を継承した Circle を作り、int radius フィールドとコンストラクタを持たせる
  3. Circle 側で area() を差し替え、(int)(radius * radius * 3.14) を返す。@Override を忘れずに
  4. circleArea の中では Shape shape = new Circle(radius); のように 親の型で受けて から area() を呼ぶ

int へのキャストで小数点以下は切り捨てになります。半径が 1 なら 3.14 から 3、10 なら 314 です。手順 4 でわざわざ親の型を経由するのは、変数の型ではなく中身で呼び先が決まることを、自分の目で確かめるためです。

要件

  1. 親クラス Shape を用意し、public int area() を定義すること (中身は 0 でよい)
  2. 子クラス Circle extends Shape を作り、@Override を付けて area() を再定義し、(int)(radius * radius * 3.14) を返すこと
  3. circleArea の中で Shape shape = new Circle(radius); のように親の型で受けて shape.area() の値を返すこと (動的ディスパッチで Circle.area が呼ばれる)

入出力例

circleArea(1) → 3 circleArea(10) → 314 circleArea(0) → 0 circleArea(5) → 78

ヒント

`@Override` アノテーションを付けると、シグネチャが親と一致しないときにコンパイル時に弾いてくれます。タイポ防止の保険として必ず付けましょう

`(int)(radius * radius * 3.14)` のように `(int)` でキャストすると小数点以下が切り捨てられます。`1 * 1 * 3.14` は `3.14` ですが `(int)` で `3` になります

`Shape s = new Circle(10); s.area();` のように親の型で受け取っても、実行時には実体の `Circle` のメソッドが呼ばれます (動的ディスパッチ)

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

関連レッスン

  • abstract で抽象クラス

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

  • interface で契約を定義

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

  • default メソッド

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

  • instanceof と型パターン

    Java の `instanceof` 演算子と、Java 16 以降のパターンマッチングを学び、オブジェクトの実型に応じて分岐するコードを書いてみよう。

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

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

  • メソッドクラスに属する関数
  • クラスデータと振る舞いを束ねる単位
  • オーバーライド親クラスのメソッドを子クラスで再定義すること。
  • 戻り値呼び出し元への返答を表す点線矢印
  • 引数位置引数=順番で渡す。
  • コンパイルソースをバイトコードへ変換する処理
  • アクセス修飾子可視性を制御するキーワード
  • 変数データに名前をつけて参照する仕組み
main.java
学習モード
エディタを読み込んでいます

メモ

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

⌘S で保存