// 抽象クラス 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 length;
private double width;
// コンストラクタ
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
// calculateArea メソッドの実装
@Override
public double calculateArea() {
return length * width;
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
// Circle クラスの利用例
Circle circle = new Circle(5.0);
System.out.println("Circle Area: " + circle.calculateArea());
// Rectangle クラスの利用例
Rectangle rectangle = new Rectangle(4.0, 6.0);
System.out.println("Rectangle Area: " + rectangle.calculateArea());
}
}
この例では、Shape
クラスが抽象メソッド calculateArea()
を宣言しています。それを継承する具象クラス Circle
と Rectangle
が、それぞれの形状に対する面積を計算するメソッドを実装しています。Main
クラスでそれぞれのクラスをインスタンス化して calculateArea()
を呼び出すことで、各形状の面積が表示されます。
出力結果:
Circle Area: 78.53981633974483
Rectangle Area: 24.0
抽象メソッドと具象メソッド
抽象メソッドと具象メソッドは、Javaにおいてオブジェクト指向プログラミングの中で重要な概念です。これらは、抽象クラスやインターフェースを通じて利用され、継承や実装において役立ちます。
抽象メソッド:
- 定義:
- 抽象メソッドはメソッドの本体(実装)がないメソッドです。
- 宣言のみを含み、メソッドの動作が具体的なクラスで定義されます。
- 宣言:
- 抽象メソッドは抽象クラスまたはインターフェースで宣言されます。
- 抽象メソッドを含むクラスは、そのクラス自体も抽象である必要があります。
- サブクラスでの実装:
- 抽象クラスを継承するサブクラスは、抽象メソッドを実装(オーバーライド)する必要があります。
- インターフェースの場合も同様で、実装クラスはインターフェースのメソッドを実装しなければなりません。
- 利点:
- 抽象メソッドを使用することで、異なるサブクラスで同じメソッド名を持ちつつ、個々のクラスに合った独自の挙動を実現できます。
abstract class Shape {
public abstract double calculateArea();
}
具象クラス Circle
のインスタンスを作成し、calculateArea()
メソッドを呼び出した結果、円の面積が計算されて表示されます。同様に、具象クラス Rectangle
のインスタンスを作成し、calculateArea()
メソッドを呼び出した結果、長方形の面積が計算されて表示されます。
具象メソッド:
- 定義:
- 具象メソッドはメソッドの本体(実装)を持つ通常のメソッドです。
- 通常のメソッドと同様に、メソッドの動作が既に実装されています。
- クラス内で直接使用:
- 具象メソッドは抽象クラスや通常のクラス内で直接使用されます。
- サブクラスでオーバーライドされることなく、そのまま使用されます。
- オーバーライド:
- 抽象クラス内の具象メソッドは、サブクラスによってオーバーライドされることがあります。
- オーバーライドにより、サブクラスは親クラスのメソッドを再定義することができます。
- 利点:
- 具象メソッドは既存の実装を提供するため、サブクラスで特別な動作が必要ない場合はそのまま使用できます。
abstract class Animal {
public void eat() {
System.out.println("Animal is eating.");
}
}
抽象メソッドと具象メソッドは、オブジェクト指向プログラミングにおいて柔軟性と再利用性を提供します。抽象メソッドは特定のクラスに固有の挙動を要求し、具象メソッドは既存の実装を提供して再利用を可能にします。