java面向对象接口和抽象类综合练习


一个简单的面向对象的案例可以是一个图形库,其中有多种不同类型的形状(如圆形、矩形、三角形等)可以被绘制在屏幕上。我们可以用接口和抽象类来实现这个图形库。

首先,我们可以定义一个 Shape 接口来表示所有形状都应该具备的共同特征,如计算面积和绘制形状。具体的形状类都应该实现这个接口。

public interface Shape {
    double getArea();
    void draw();
}

接下来,我们可以定义一个抽象类 AbstractShape 来实现 Shape 接口的方法中的一些公共部分,同时定义一些形状的基本属性,如位置、颜色等。这个抽象类也可以提供一些公共方法,如获取形状的位置和颜色等。

public abstract class AbstractShape implements Shape {
    protected int x;
    protected int y;
    protected Color color;

    public AbstractShape(int x, int y, Color color) {
        this.x = x;
        this.y = y;
        this.color = color;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Color getColor() {
        return color;
    }

    @Override
    public void draw() {
        System.out.println("Drawing shape at (" + x + "," + y + ") with color " + color);
    }
}

现在我们可以定义一些具体的形状类,如圆形、矩形和三角形,它们都继承自 AbstractShape 类并实现 Shape 接口。

public class Circle extends AbstractShape {
    private int radius;

    public Circle(int x, int y, Color color, int radius) {
        super(x, y, color);
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

public class Rectangle extends AbstractShape {
    private int width;
    private int height;

    public Rectangle(int x, int y, Color color, int width, int height) {
        super(x, y, color);
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}

public class Triangle extends AbstractShape {
    private int base;
    private int height;

    public Triangle(int x, int y, Color color, int base, int height) {
        super(x, y, color);
        this.base = base;
        this.height = height;
    }

    @Override
    public double getArea() {
        return 0.5 * base * height;
    }
}

现在我们可以创建一个测试类来测试这些形状类的功能。

public class ShapeTest {
    public static void main(String[] args) {
        Shape circle = new Circle(100, 100, Color.RED, 50);
        Shape rectangle = new Rectangle(200, 200, Color.BLUE, 100, 50);
        Shape triangle = new Triangle(300, 300, Color.GREEN, 50, 100);

        circle.draw();
        System.out.println("Circle area: " + circle.getArea());
csharpCopy code    rectangle.draw();
    System.out.println("Rectangle area: " + rectangle.getArea());

    triangle.draw();
    System.out.println("Triangle area: " + triangle.getArea());
}}

输出结果应该是:

Drawing shape at (100,100) with color java.awt.Color[r=255,g=0,b=0] Circle area: 7853.981633974483 Drawing shape at (200,200) with color java.awt.Color[r=0,g=0,b=255] Rectangle area: 5000.0 Drawing shape at (300,300) with color java.awt.Color[r=0,g=255,b=0] Triangle area: 2500.0

通过这个案例,我们可以看到接口和抽象类的用法。通过定义 Shape 接口,我们可以让所有形状类都具备计算面积和绘制形状的功能。通过定义 AbstractShape 抽象类,我们可以将一些公共部分提取出来,避免了代码的重复。通过继承 AbstractShape 类并实现 Shape 接口,我们可以定义具体的形状类,并在测试类中调用它们的方法。这种方式使得代码更加清晰、简洁,也更易于维护。

此外,接口和抽象类还有以下几个不同之处:

  1. 接口只包含方法签名,不包含方法实现,而抽象类可以包含具体方法的实现。因此,抽象类可以提供一些默认的实现,而接口不能。
  2. 一个类可以实现多个接口,但只能继承一个抽象类。
  3. 抽象类可以包含实例变量,而接口不能。
  4. 抽象类可以用来定义一个类的基本结构,而接口则用来定义一个类应该具备的行为。

在实际编程中,我们可以根据具体的需求来选择使用接口或抽象类。如果需要定义一组相互独立的行为,或者需要将不同的类归为一类,那么就应该使用接口。如果需要定义一个类的基本结构,并为它提供一些默认的实现,那么就应该使用抽象类。


原文链接:codingdict.net