假设有以下Java代码: ```java interface Shape { void draw(); } class Circle implements Shape { @Override public void draw() { System.out.println("Drawing a circle"); } } class Square implements Shape { @Override public void draw() { System.out.println("Drawing a square"); } } public class Test2 { public static void main(String[] args) { Shape[] shapes = new Shape[2]; shapes[0] = new Circle(); shapes[1] = new Square(); // 假设此处存在一条语句,能够实现遍历shapes数组并调用每个元素的draw()方法,输出对应的图形 } } ``` 在`Test2`的`main`方法中,横线处最适合的代码段是什么,使其能够正确利用多态性打印出“Drawing a circle”和“Drawing a square”?
答案解析
A选项错误,虽然能够实现功能,但是违反了多态的核心思想,需要使用instanceof判断具体类型,代码耦合性高,扩展性差。应该直接调用父类接口的方法,让运行时去选择子类的具体实现。
B选项正确,利用多态特性,直接调用父接口`Shape`的`draw()`方法,根据数组中存放的实际对象的类型,会调用相应的子类重写后的`draw()`方法,实现动态绑定。
C选项错误,虽然能够实现功能,但是仍然使用了instanceof来判断类型,本质上没有利用好多态性,与A选项类似。
D选项错误,可以强制转换为Shape类型,但是语法上还是存在着需要转换的步骤,且循环类型不符, 还是B选项最为简练。
正确答案:B