1. base=4, height=5 のとき 4 * 5 / 2 = 10
  2. base=0 のとき面積は 0
  3. base=7, height=3 のとき 21 / 2 = 10 (整数除算)
  4. base=10, height=10 のとき 100 / 2 = 50
  5. base=1, height=1 のとき 1 / 2 = 0 (整数除算で切り捨て)
コース一覧
Java 中級:コレクション・Stream・例外処理
abstract で抽象クラス

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分

abstract で抽象クラス

中身の書きようがないのに、とりあえず 0 を返している

親クラスにメソッドを置くとき、親の段階では計算式が決まらないことがあります。従業員の月給は、正社員なら月額固定、アルバイトなら時給と勤務時間の掛け算で、「従業員」という親だけでは決めようがありません。

そこで仮に return 0; と書いておくと、2 つの困りごとが起きます。子で実装を書き忘れても黙って 0 が返ること、そして中身の無い new Employee() が作れてしまうことです。

本体を書かず、名前だけ決める

abstract を付けると、この 2 つがまとめて解決します。

Java

abstract class Employee { private final String name; protected Employee(String name) { this.name = name; } // 本体を書かず、セミコロンで終える public abstract int monthlyPay(); // 中身のあるメソッドも普通に置ける public String describe() { return name + " の月給は " + monthlyPay() + " 円"; } }

public abstract int monthlyPay(); は { } を持たず ; で終わります。「このメソッドは必ずあるが、中身は子が書く」という約束だけを置いた状態です。一方で describe() のような共通処理は親に書けますし、フィールドもコンストラクタも普通に持てます。

子は宿題を埋める側になります。

Java

class FullTimeEmployee extends Employee { private final int monthly; public FullTimeEmployee(String name, int monthly) { super(name); this.monthly = monthly; } @Override public int monthlyPay() { return monthly; } }

書き忘れると FullTimeEmployee is not abstract and does not override abstract method monthlyPay() で止まります。実行するまで気づけなかったはずの抜けが、コンパイルの時点で出てくるようになりました。

new Employee(...) はもう作れない

abstract が付いたクラスは直接インスタンス化できません。new Employee("佐藤") と書くと Employee is abstract; cannot be instantiated になります。変数の型として使うのは自由なので、Employee e = new FullTimeEmployee("佐藤", 300000); の形で扱います。

子の側でまだ実装を決められないときは、その子自身も abstract にして、さらに下の世代へ宿題を回せます。

解説

final と abstract は同時に付けられません。final は「これ以上継承させない」、abstract は「継承して埋めてもらう」で、意味が正反対だからです。

やってみよう

triangleArea(int base, int height) を完成させてください。

  1. abstract class Shape を定義し、public abstract int area(); を宣言する。本体の { } は付けません
  2. Triangle extends Shape を作り、コンストラクタで base と height を受け取る
  3. Triangle 側で area() を実装し、base * height / 2 を返す
  4. triangleArea の中で Triangle のインスタンスを作り、area() の結果を返す

int どうしの割り算なので、小数点以下は自動で切り捨てられます。7 と 3 なら 21 / 2 で 10 です。double にキャストしたくなりますが、ここは整数のまま素直に返してください。

要件

  1. abstract class Shape を定義し、abstract int area(); を宣言すること (本体 { } は付けない)
  2. Triangle extends Shape を定義し、@Override で area() を実装して base * height / 2 を返すこと
  3. Solution.triangleArea の中で new Triangle(base, height) を作り、その area() の戻り値を返すこと

入出力例

triangleArea(4, 5) → 10 triangleArea(0, 5) → 0 triangleArea(7, 3) → 10 triangleArea(10, 10) → 50 triangleArea(1, 1) → 0

ヒント

抽象メソッドは `public abstract int area();` のように本体を書かずセミコロンで終わります。`{ }` を付けるとコンパイルエラーになります

同じファイルに複数の `class` を書くときは `public` を付けられるのは 1 つだけです。`class Triangle extends Shape { ... }` のようにパッケージプライベートで書きます

`int` 同士の割り算は自動で切り捨て (整数除算) になります。`7 * 3 / 2` は `21 / 2 = 10` です。`double` キャストは不要です

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

関連レッスン

  • interface で契約を定義

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

  • default メソッド

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

  • instanceof と型パターン

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

  • ポリモーフィズムを活かす

    親クラス Shape の area() を子クラス Circle と Square がそれぞれ独自に実装し、List<Shape> にまとめて合計面積を求めるコードを書きながら、ポリモーフィズムの本質である動的ディスパッチを体感しよう。

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

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

  • クラスデータと振る舞いを束ねる単位
  • メソッドクラスに属する関数
  • 処理計算や代入を表す長方形
  • フィールドクラスが持つデータ
  • コンストラクタインスタンス生成時の初期化処理
  • コンパイルソースをバイトコードへ変換する処理
  • インスタンスクラスから生成された実体
  • 変数データに名前をつけて参照する仕組み
main.java
学習モード
エディタを読み込んでいます

メモ

abstract で抽象クラス

⌘S で保存