本项目旨在设计一个包含抽象方法的图形基类,并通过实现圆形、矩形、正方形及三角形等具体子类来展示多态性与继承的应用。
设计一个抽象类`Shape`(图形类),该类包含至少两个抽象方法:求周长的方法和求面积的方法。接着定义四个具体的子类——圆形、长方形、正方形以及三角形,它们都继承自`Shape`并实现上述的两个方法。
为了创建这样的结构,在Java中需要使用关键字`abstract`来声明一个抽象类,并且该类中的所有抽象方法(即没有具体实现的方法)必须在非抽象子类中被重写。每一个具体的图形类型都需要通过`extends Shape`的方式继承这个抽象基类,然后分别提供计算周长和面积的具体逻辑。
以下是四个特定形状的定义示例:
```java
import java.util.Scanner;
import static java.lang.Math.PI;
abstract class Shape {
public abstract double getPerimeter();
public abstract double getArea();
}
class Circle extends Shape {
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getPerimeter() {
return 2 * PI * radius;
}
@Override
public double getArea() {
return PI * Math.pow(radius, 2);
}
}
class Rectangle extends Shape {
private final double width;
private final double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getPerimeter() {
return (width + height) * 2;
}
@Override
public double getArea() {
return width * height;
}
}
class Square extends Shape {
private final double side;
public Square(double side) {
this.side = side;
}
@Override
public double getPerimeter() {
return 4 * side;
}
@Override
public double getArea() {
return Math.pow(side, 2);
}
}
class Triangle extends Shape {
private final double base;
private final double height;
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
@Override
public double getPerimeter() {
// 假设三角形为直角等腰,实际应用中需要根据具体类型计算所有边长之和。
return 2 * Math.sqrt(Math.pow(base, 2) / 2);
}
@Override
public double getArea() {
return (base * height) / 2;
}
}
```