ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
抽象クラス・抽象メソッドの基本構文
Java の abstract キーワードでクラスやメソッドを「抽象」として宣言できます。抽象クラスは自分自身では new できず、サブクラスで具体化されることを前提とした設計用クラスです。
// 抽象クラスの宣言
abstract class Animal {
// 共通フィールド
protected String name;
// コンストラクタ (抽象クラスでも可)
public Animal(String name) {
this.name = name;
}
// 具象メソッド (普通のメソッド)
public String getName() {
return name;
}
// 抽象メソッド (本体なし)
public abstract void sound();
}
// サブクラスで実装
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void sound() {
System.out.println(name + ": ワン");
}
}
class Cat extends Animal {
public Cat(String name) { super(name); }
@Override
public void sound() {
System.out.println(name + ": ニャー");
}
}
public class Main {
public static void main(String[] args) {
// Animal a = new Animal("x"); // ❌ コンパイルエラー
Animal a = new Dog("ポチ");
a.sound(); // ポチ: ワン
}
}
抽象クラスのルール
| 項目 | 可否 | 説明 |
|---|---|---|
インスタンス化 (new) | 不可 | サブクラス経由のみ |
| コンストラクタ | 可 | サブクラスから super(...) で呼ばれる |
| フィールド | 可 | protected / private OK |
| 具象メソッド | 可 | 共通処理を集約できる |
| 抽象メソッド | 可 | 1 つもなくても良いがその場合は抽象にする意味薄 |
static abstract | 不可 | static は継承で override 不可 |
final abstract | 不可 | final は継承禁止と矛盾 |
private abstract | 不可 | private はサブクラスから見えず override 不能 |
Template Method パターン
抽象クラスの最も典型的な使い方。「処理の骨格を親で固定、一部だけ子で変える」設計。
abstract class ReportGenerator {
// テンプレートメソッド (final で上書き禁止)
public final void generate() {
loadData();
String body = formatBody(); // 子で実装
String html = renderHtml(body);
save(html);
}
private void loadData() { System.out.println("DB から読込"); }
protected abstract String formatBody(); // ★ 子で変える
private String renderHtml(String body) {
return "<html>" + body + "</html>";
}
private void save(String html) { System.out.println("保存: " + html); }
}
class SalesReport extends ReportGenerator {
@Override
protected String formatBody() {
return "<h1>売上レポート</h1><p>...</p>";
}
}
class UserReport extends ReportGenerator {
@Override
protected String formatBody() {
return "<h1>ユーザレポート</h1><p>...</p>";
}
}
// 利用側
new SalesReport().generate();
new UserReport().generate();
Strategy パターン (抽象クラス版)
Strategy は interface で書く方が一般的ですが、共通フィールド/コンストラクタが欲しい場合は抽象クラスで:
abstract class Discount {
protected final String name;
protected Discount(String name) { this.name = name; }
public abstract int apply(int price);
}
class PercentDiscount extends Discount {
private final int percent;
public PercentDiscount(int p) {
super("PCT" + p);
this.percent = p;
}
@Override
public int apply(int price) {
return price - price * percent / 100;
}
}
class FixedDiscount extends Discount {
private final int amount;
public FixedDiscount(int a) {
super("FIX" + a);
this.amount = a;
}
@Override
public int apply(int price) {
return Math.max(0, price - amount);
}
}
// 利用
Discount d = new PercentDiscount(10);
System.out.println(d.apply(1000)); // 900
抽象クラス vs インタフェース
| 項目 | abstract class | interface |
|---|---|---|
| 多重継承 | 不可 (1 親のみ) | 可 (複数 implements) |
| 状態 (フィールド) | 持てる | 定数 (public static final) のみ |
| コンストラクタ | 持てる | 不可 |
| default メソッド | 全メソッド OK | Java 8+ で可 |
| アクセス修飾子 | 自由 | メソッドは原則 public |
| 意味的役割 | 「is-a」(共通実装含む型階層) | 「can-do」(能力) |
| 使い分け | 共通実装が大量にあるとき | 純粋な契約だけ表現したいとき |
判断基準: 共通フィールドや具象メソッドが多いなら抽象クラス、能力の定義だけなら interface。両方を組み合わせる (interface を実装した抽象クラスを作る) のも一般的。
Java 17 sealed class との組合せ
Java 17+ では sealed で継承可能な子クラスを限定できます。抽象クラスと組合せると網羅的な switch (パターンマッチ) が書けます:
// 図形を Circle / Square / Triangle に限定
sealed abstract class Shape permits Circle, Square, Triangle {
public abstract double area();
}
final class Circle extends Shape {
private final double r;
Circle(double r) { this.r = r; }
@Override public double area() { return Math.PI * r * r; }
}
final class Square extends Shape {
private final double s;
Square(double s) { this.s = s; }
@Override public double area() { return s * s; }
}
final class Triangle extends Shape {
private final double b, h;
Triangle(double b, double h) { this.b = b; this.h = h; }
@Override public double area() { return b * h / 2; }
}
// Pattern matching for switch (Java 21+)
String desc = switch (shape) {
case Circle c -> "円 r=" + c;
case Square s -> "正方形";
case Triangle t -> "三角形";
// default 不要 (sealed で網羅性チェック)
};
典型的なミスと回避
| ミス | 結果 | 対処 |
|---|---|---|
| abstract メソッドに本体を書く | コンパイルエラー | ; で終わらせる |
| abstract クラスを new する | コンパイルエラー | サブクラス経由で new |
| サブクラスで abstract メソッド未実装 | サブクラスも abstract 扱いになる | 全 abstract を override or サブクラスも abstract に |
@Override 忘れ | シグネチャ違いで別メソッドになり気付かない | 必ず付ける (IDE 警告 ON) |
| 深い継承 (5 階層以上) | Fragile Base Class 問題 | Composition Over Inheritance を検討 |
FAQ
Q: 抽象クラスに具象メソッドだけで abstract メソッドが 1 つもないと?
A: 文法的には可能。new 禁止だけが残ります。が、設計として中途半端で意味薄。通常は protected コンストラクタの普通クラスにします。
Q: abstract クラスは interface で全部書けない?
A: Java 8+ の default メソッドでかなり代替可能。ただし状態を持つフィールドとコンストラクタは interface では不可。状態が必要なら抽象クラス。
Q: 抽象クラスを継承した上でさらに抽象にできる?
A: 可能。抽象 → 抽象 → 具象 の 3 段継承も OK。ただし深い継承は保守性を下げます。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?