使用for循环打印ArrayList中图形遇问题,求示例指引
问题分析与修正思路
我来帮你理清楚这个问题的核心和修正方向~首先看你当前写的printShapes方法,这里有两个关键问题:一是你试图直接遍历Circle类,而不是你已经创建好的shapes集合;二是方法的访问权限和调用方式不匹配,导致main方法里没法直接调用它。
正确的实现示例(核心片段)
先给你修正后的printShapes方法,以及在main里的调用方式:
修正后的printShapes方法
// 改成静态方法,这样静态的main方法可以直接调用 public static void printShapes(ArrayList<Shape> shapes) { // 遍历传入的shapes集合,元素类型是Shape(多态适配所有子类) for (Shape shape : shapes) { // 这行代码和System.out.println(shape.toString())完全等效,Java会自动调用子类重写的toString System.out.println(shape); } }
在main方法末尾添加调用
// 在main方法的最后,所有add操作完成后添加这行 printShapes(shapes);
为什么要这么写?
- 遍历对象要正确:你要打印的是已经添加了各种图形的
shapes集合,增强for循环的格式是for (元素类型 变量名 : 目标集合/数组),所以这里元素类型用Shape(因为集合是ArrayList<Shape>),目标是shapes这个集合,而不是某个类。 - 多态与toString的作用:你的
Circle类已经正确重写了toString方法,当你打印shape对象时,Java会自动根据对象的实际类型(比如Circle、Rectangle)调用对应的子类toString实现,所以能输出每个图形的具体信息。只要你的Rectangle和Triangle类也同样重写了toString,就能统一打印出各自的图形数据。 - 方法访问权限适配:因为main方法是静态的,要么把
printShapes改成静态方法,要么在main里创建FinalExam的实例(比如FinalExam exam = new FinalExam(); exam.printShapes(shapes);),这样才能正常调用。
补充:其他子类的toString示例(参考)
比如Rectangle类的toString可以这么写,和Circle的风格保持一致:
@Override public String toString() { return "Rectangle" + "[Width:" + getWidth() + ", Height:" + getHeight() + "] Area:" + String.format("%.02f", getArea()); }
这样整个流程就通顺了:创建各类图形对象→添加到shapes集合→调用printShapes遍历打印每个对象(自动触发子类的toString输出)。
内容的提问来源于stack exchange,提问作者DANIEL UNDERWOOD
相关产品推荐
相关产品推荐

