Java 抽象化マスター:抽象クラス、抽象メソッド、実践例
Java における抽象化とは?
Java における抽象化は、オブジェクトの本質的な機能のみを公開し、ユーザーにとって無関係な内部実装詳細を隠蔽します。複雑さと労力を減らし、開発を簡素化します。抽象化は 抽象クラス、抽象メソッド、インターフェース を通じて実現され、Java のオブジェクト指向設計の核心概念です。
このチュートリアルで学ぶこと:
- 抽象クラス とは何か、いつ使うか
- 抽象メソッド が契約を定義する役割
- 抽象化を実演する具体的なコード例
- 抽象クラスがポリモーフィズムとコード再利用をどう可能にするか
- Java における final キーワードの目的
抽象クラスの理解
抽象クラス は、それ自体をインスタンス化できないが、関連するサブクラスの共通基盤を定義できるクラスです。抽象メソッド(本体なし)と具象メソッド(完全実装)の両方を含められます。抽象クラスの定義的特徴は、少なくとも1つの抽象メソッドを宣言するか、設計上の理由で明示的に abstract とマークされていることです。
多くの Java チュートリアルで使われる古典的な Shape(図形) 階層を考えてみましょう:
Shape クラスは共有属性と calculateArea() メソッドシグネチャを持ち、Rectangle、Circle、Triangle が具象実装を提供します。理論上 Shape クラスはインスタンス化可能ですが、意味的に無意味でエラーの原因になり得るため、abstract 宣言します:
abstract class Shape {
// 共有コード
}
抽象メソッドとは?
抽象メソッド は、実装を提供せずにメソッドシグネチャのみを宣言するものです。抽象クラス内で定義され、具象サブクラスでオーバーライドされなければなりません。本体がないため、final や static を付けることはできません。
構文例:
abstract public void calculateArea();
Shape の例では、各サブクラスが独自の公式で calculateArea() を実装し、共通インターフェースを保ちながらすべての図形が面積を報告できるようにします。
実践コード例
abstract class Shape {
abstract void calculateArea();
}
class Rectangle extends Shape {
void calculateArea() {
System.out.println("Area of Rectangle");
}
public static void main(String[] args) {
Shape obj = new Rectangle();
obj.calculateArea();
}
}
抽象クラスの重要ポイント
- 抽象クラスは抽象メソッドと具象メソッドの両方を含められる
- 抽象メソッドがなくても、基底型として意図される場合は
abstract宣言可能 - 抽象型の参照でポリモーフィズムを実現:
Shape obj = new Rectangle(); - 抽象メソッドを宣言するクラスは必ず抽象クラスでなければならない
Java の final キーワード
final 修飾子は、クラス、メソッド、変数をロックダウンし、オーバーライドや変更を防ぎます:
- final クラス – 継承を禁止
- final 変数 – 定数化し、初期化後の値変更を禁止
- final メソッド – オーバーライドを禁止、セキュリティやパフォーマンス最適化によく使用
例:Abstract と Final の組み合わせ
abstract class Shape {
final int b = 20;
public void display() {
System.out.println("This is display method");
}
abstract public void calculateArea();
}
public class Rectangle extends Shape {
public static void main(String[] args) {
Rectangle obj = new Rectangle();
obj.display();
// obj.b = 200; // コンパイルエラー: final 変数に代入不可
}
@Override
public void calculateArea() {
System.out.println("Calculating rectangle area");
}
}
calculateArea() の実装をアンコメントするとコンパイルエラーが解消し、b の変更を試みると final 変数の不変性が示されます。
抽象メソッドのルール
- 実装はなく、シグネチャのみ
- 抽象メソッドを含む場合、クラスは抽象クラスでなければならない(含まない場合でも設計上 abstract 宣言可能)
- 具象サブクラスは、自身も abstract 宣言されていない限り、継承したすべての抽象メソッドを実装しなければならない
Java
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C#抽象クラス実践チュートリアル:コード例で理解する設計パターン
- Java抽象クラスとメソッド:包括的ガイド
- Java String.length()メソッド:文字列サイズ取得の実例解説
- Java String.charAt()完全解説:構文、戻り値、例外、実例
- Java String.contains()メソッド:部分文字列チェックの実践例
- Java String.endsWith()マスター:文字列サフィックスチェック実例付き
- Java インターフェース vs 抽象クラス:適切な抽象化の選び方
- Java BufferedReader でファイル読み込み:実践ガイドと例
- Javaで挿入ソート:わかりやすい例とステップバイステップガイド
- Java抽象化完全ガイド: 抽象クラス・抽象メソッドで実装を隠蔽し設計を簡潔に