【Java】抽象修飾子(abstract)について
抽象クラスとは
Javaにおいて、abstract
修飾子はクラスまたはメソッドに使用されます。抽象クラスとは、オブジェクトを直接生成できないクラスのことです。このクラスは他のクラスによって継承されることを目的としています。
抽象クラスには、具象メソッド(具体的な実装を持つメソッド)と抽象メソッド(実装を持たないメソッド)を含めることができます。
// 抽象クラスの例
abstract class Animal {
// 抽象メソッド
abstract void sound();
// 具象メソッド
void sleep() {
System.out.println("Sleeping...");
}
}
抽象メソッドとは
抽象メソッドは、メソッドのシグネチャ(メソッド名、引数リスト、戻り値の型)のみを定義し、その実装を持たないメソッドです。抽象メソッドを定義する場合、abstract
キーワードを使用します。
抽象メソッドは、abstract
で修飾されたクラス内にのみ記述できます。抽象メソッドを持つクラスは必ず抽象クラスでなければなりません。
// 抽象メソッドの例
abstract class Bird {
abstract void fly();
}
具体クラスと抽象クラスの違い
具体クラス(通常のクラス)と抽象クラスの主な違いは、オブジェクトを生成できるかどうかです。
- 具体クラス: 全てのメソッドが具体的な実装を持ち、オブジェクトを生成できます。
- 抽象クラス: 実装の一部または全部が未定義で、オブジェクトを直接生成できません。
// 具体クラスの例
class Dog extends Animal {
@Override
void sound() {
System.out.println("Bark!");
}
}
// オブジェクト生成
Dog dog = new Dog();
dog.sound();
dog.sleep();
抽象クラスと抽象メソッドの使用場面
抽象クラスと抽象メソッドは、以下のような状況で役立ちます:
- 共通の振る舞いやプロパティを複数のクラスに持たせたい場合。
- 具象クラスで具体的な実装を強制したい場合。
- テンプレートメソッドパターンなどの設計パターンを実装する場合。
たとえば、動物の種類によって鳴き声が異なる場合、Animal
という抽象クラスに共通の振る舞いを定義し、具象クラス(例: Dog
やCat
)で異なる鳴き声を実装できます。
実践例
以下は、抽象クラスと抽象メソッドを用いた具体的な例です。
// 抽象クラス
abstract class Shape {
String color;
// コンストラクタ
Shape(String color) {
this.color = color;
}
// 抽象メソッド
abstract double area();
// 具象メソッド
String getColor() {
return color;
}
}
// 具象クラス
class Circle extends Shape {
double radius;
Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
}
class Rectangle extends Shape {
double width, height;
Rectangle(String color, double width, double height) {
super(color);
this.width = width;
this.height = height;
}
@Override
double area() {
return width * height;
}
}
// 使用例
public class Main {
public static void main(String[] args) {
Shape circle = new Circle("Red", 5);
Shape rectangle = new Rectangle("Blue", 4, 6);
System.out.println("Circle Area: " + circle.area());
System.out.println("Rectangle Area: " + rectangle.area());
System.out.println("Circle Color: " + circle.getColor());
}
}
抽象修飾子を使うメリット
コードの再利用性と保守性: 抽象クラスを使用すると、共通のロジックを一元管理でき、コードの重複を減らせます。
柔軟性: 具象クラスで異なる実装を提供することが可能なため、多様な振る舞いに対応できます。
設計パターンとの親和性: 抽象クラスは、ファクトリーパターンやテンプレートメソッドパターンなどの設計パターンで頻繁に使用されます。
以上が、Javaにおけるabstract
修飾子の詳細な解説です。抽象クラスと抽象メソッドを正しく活用することで、コードの拡張性と保守性を高めることができます。