以一个简单的图形绘制程序为例,其中我们将创建一个抽象类`Shape`,它定义了所有形状共有的行为和属性,同时允许具体的子类提供自己的实现。

 

首先,我们定义一个抽象类`Shape`:

 

```java
public abstract class Shape {
    // 形状的共有属性,颜色
    protected String color;
 
    // 构造函数,设置形状的颜色
    public Shape(String color) {
        this.color = color;
    }
 
    // 抽象方法,计算形状的面积
    public abstract double calculateArea();
 
    // 抽象方法,计算形状的周长
    public abstract double calculatePerimeter();
 
    // 非抽象方法,显示形状的颜色
    public void displayColor() {
        System.out.println("The shape is " + color + ".");
    }
}
```

 

在这个`Shape`类中,我们定义了一个保护属性`color`,它存储了形状的颜色。我们还定义了两个抽象方法`calculateArea()`和`calculatePerimeter()`,它们要求子类提供具体的实现来计算面积和周长。

此外,我们还提供了一个非抽象方法`displayColor()`,它用来输出形状的颜色信息。

 

接下来,我们创建两个具体的子类`Circle`和`Rectangle`,它们继承自`Shape`类,并实现抽象方法:

 

```java
public class Circle extends Shape {
    private double radius;
 
    // 构造函数
    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
 
    // 实现计算面积的方法
    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
 
    // 实现计算周长的方法
    @Override
    public double calculatePerimeter() {
        return 2 * Math.PI * radius;
    }
}
 
public class Rectangle extends Shape {
    private double width;
    private double height;
 
    // 构造函数
    public Rectangle(String color, double width, double height) {
        super(color);
        this.width = width;
        this.height = height;
    }
 
    // 实现计算面积的方法
    @Override
    public double calculateArea() {
        return width * height;
    }
 
    // 实现计算周长的方法
    @Override
    public double calculatePerimeter() {
        return 2 * (width + height);
    }
}
```

 

在`Circle`和`Rectangle`类中,我们添加了各自的属性,并提供了计算面积和周长的具体实现。这样,我们就可以根据具体的图形类型来创建对象,并使用它们的方法。

 

最后,我们可以创建一个简单的测试程序来演示这些类的使用:

```java
public class ShapeDemo {
    public static void main(String[] args) {
        // 创建一个圆形对象
        Circle circle = new Circle("Red", 5.0);
        // 创建一个矩形对象
        Rectangle rectangle = new Rectangle("Blue", 4.0, 6.0);
 
        // 显示形状的颜色
        circle.displayColor();
        rectangle.displayColor();
 
        // 计算并显示圆形的面积和周长
        System.out.println("Circle area: " + circle.calculateArea());
        System.out.println("Circle perimeter: " + circle.calculatePerimeter());
 
        // 计算并显示矩形的面积和周长
        System.out.println("Rectangle area: " + rectangle.calculateArea());
        System.out.println("Rectangle perimeter: " + rectangle.calculatePerimeter());
    }
}
```

 

在这个`ShapeDemo`类的`main`方法中,我们创建了一个红色的圆形和一个蓝色的矩形。我们调用了`displayColor()`方法来显示它们的颜色,以及调用了`calculateArea()`和`calculatePerimeter()`方法来计算和显示它们的面积和周长。

 

这个简单的例子展示了抽象类如何定义共有的行为和属性,以及具体的子类如何提供这些行为的具体实现。通过这种方式,我们可以创建一个灵活且可扩展的图形绘制程序,它可以轻松地添加新的形状类型。