ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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 と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?