abstract class GraphicObject {
// 抽象方法,具体实现由子类完成
public abstract void draw();
}
class Rectangle extends GraphicObject {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
class Triangle extends GraphicObject {
@Override
public void draw() {
System.out.println("绘制三角形");
}
}
class Ellipse extends GraphicObject {
@Override
public void draw() {
System.out.println("绘制椭圆");
}
}
public class Main {
public static void main(String[] args) {
GraphicObject[] graphicObjects = new GraphicObject[3];
graphicObjects[0] = new Rectangle();
graphicObjects[1] = new Triangle();
graphicObjects[2] = new Ellipse();
for (GraphicObject graphicObject : graphicObjects) {
graphicObject.draw();
}
}
}
这种设计体现Java抽象类的特性:
- 抽象方法与抽象类:
GraphicObject
类定义了抽象方法draw
,它自身也被定义为抽象类。抽象类不能被实例化,其存在意义是为子类提供一个通用的框架和规范,子类必须实现抽象类中的抽象方法,这里Rectangle
、Triangle
和Ellipse
子类都实现了draw
方法。
- 代码复用与继承:子类
Rectangle
、Triangle
和Ellipse
继承自GraphicObject
,继承了GraphicObject
类的结构和可能有的通用行为(虽然这里GraphicObject
除了抽象方法没有其他行为),实现了代码的复用,减少重复代码的编写。
多态的优势:
- 可扩展性:在
GraphicObject
数组中,可以方便地添加新的GraphicObject
子类实例,而不需要修改遍历数组调用draw
方法的代码。如果有新的图形类如Circle
,只需要让Circle
继承GraphicObject
并实现draw
方法,就可以加入到数组中,遍历代码无需改动。
- 灵活性:通过
GraphicObject
类型的数组存储不同子类实例,在遍历调用draw
方法时,Java虚拟机根据对象的实际类型(运行时类型)来决定调用哪个子类的draw
方法,而不是根据引用变量的声明类型。这使得代码更加灵活,能够根据不同对象类型执行不同的行为。
- 简化代码:不需要针对每个具体图形类型编写单独的处理逻辑,通过统一的
GraphicObject
引用和draw
方法调用来处理不同类型的图形,简化了代码结构,提高了代码的可读性和维护性。