interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
public class TestShape {
public static void main(String[] args) {
Shape[] shapes = new Shape[2];
shapes[0] = new Circle();
shapes[1] = new Rectangle();
for (Shape shape : shapes) {
shape.draw();
}
}
}
多态性体现
- 编译时多态:在
Shape[] shapes = new Shape[2];
这行代码中,声明了一个 Shape
类型的数组,它可以存放任何实现了 Shape
接口的对象,这里体现了编译时多态,即通过接口类型来引用不同实现类的对象。
- 运行时多态:在遍历数组
for (Shape shape : shapes) { shape.draw(); }
过程中,shape.draw()
方法在运行时根据 shape
实际指向的对象类型(Circle
或 Rectangle
)来调用对应的 draw
方法,这体现了运行时多态。即同样的方法调用语句,在运行时根据对象的实际类型执行不同的实现。
接口作用
- 规范行为:接口
Shape
定义了 draw
方法,这就规范了所有实现它的类(如 Circle
和 Rectangle
)必须提供 draw
方法的具体实现,使得不同形状类有统一的绘制行为定义。
- 实现多态:接口作为一种引用类型,使得
Shape
类型的数组可以存放 Circle
和 Rectangle
等不同实现类的对象,进而在遍历数组调用 draw
方法时实现多态行为,提高了代码的灵活性和可扩展性。如果需要添加新的形状类(如 Triangle
),只需要让 Triangle
类实现 Shape
接口,就可以很方便地添加到 Shape
数组中并参与多态调用,而不需要修改大量现有代码。