// 抽象クラス Shape の定義
abstract class Shape {
// 抽象メソッド calculateArea() の宣言
public abstract double calculateArea();
}
// 具象クラス Circle の定義
class Circle extends Shape {
// 円の半径
private double radius;
// コンストラクタ
public Circle(double radius) {
this.radius = radius;
}
// calculateArea() メソッドの実装
@Override
public double calculateArea() {
return Math.PI * radius * radius; // 円の面積の計算
}
}
// 具象クラス Rectangle の定義
class Rectangle extends Shape {
// 長方形の幅と高さ
private double width;
private double height;
// コンストラクタ
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// calculateArea() メソッドの実装
@Override
public double calculateArea() {
return width * height; // 長方形の面積の計算
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Circle クラスのインスタンスを作成して calculateArea() メソッドを呼び出す
Circle myCircle = new Circle(5.0);
System.out.println("円の面積: " + myCircle.calculateArea());
// Rectangle クラスのインスタンスを作成して calculateArea() メソッドを呼び出す
Rectangle myRectangle = new Rectangle(4.0, 6.0);
System.out.println("長方形の面積: " + myRectangle.calculateArea());
}
}
このコードでは、Shape
クラスが抽象クラスとして、calculateArea()
メソッドが抽象メソッドとして宣言されています。そして、Circle
クラスと Rectangle
クラスがそれぞれ Shape
クラスを継承し、calculateArea()
メソッドをオーバーライドして円や長方形の面積を計算しています。main
メソッドでは、それぞれのクラスのインスタンスを作成して面積を計算し、結果を表示しています。
抽象メソッドの強制
抽象メソッドは、抽象クラス内で宣言されるメソッドであり、その本体(実装)が存在せず、サブクラスによって実装されなければならないメソッドです。以下に、抽象メソッドの強制的な実装について解説します。
抽象メソッドの宣言:
抽象メソッドは、抽象クラス内でメソッドの定義だけがされ、本体が記述されません。これにより、抽象クラスがそのメソッドを直接実装することができなくなります。
abstract class Animal {
// 抽象メソッドの宣言
public abstract void makeSound();
}
サブクラスでの実装の強制:
抽象メソッドが存在する抽象クラスを継承する具象クラスは、その抽象メソッドをオーバーライドして実装する必要があります。
これにより、抽象クラスを継承するすべてのサブクラスが、共通のメソッドを提供することが期待されます。
class Dog extends Animal {
// 抽象メソッドの実装
@Override
public void makeSound() {
System.out.println("ワンワン");
}
}
メソッドの具体的な機能の提供:
サブクラスで抽象メソッドを実装することで、各サブクラスが具体的な機能を提供できます。この具体的な機能が、各サブクラスが担当する役割や特性に応じて異なることが期待されます。
class Cat extends Animal {
// 抽象メソッドの実装
@Override
public void makeSound() {
System.out.println("ニャー");
}
}
ポリモーフィズムの活用:
抽象メソッドを介してポリモーフィズムが実現されます。抽象クラスの型を持つ変数は、その具象クラスのインスタンスを代入できます。これにより、プログラムの柔軟性が向上し、異なるサブクラスのオブジェクトを共通の基底クラスとして扱えます。
Animal myAnimal = new Dog();
myAnimal.makeSound(); // 実際には Dog クラスの makeSound() が呼ばれる
抽象メソッドを使用することで、クラス階層構造を設計し、異なるサブクラスが共通のインターフェースを提供することができます。これにより、プログラムの構造が整理され、拡張やメンテナンスが容易になります。