如何创建存储多种不同对象的ArrayList并添加其引用
嘿,这个问题其实在Java里是利用多态特性就能轻松解决的,我来一步步给你讲清楚怎么做:
核心思路
让你要存储的所有对象(比如Rectangle和RightTriangle)都继承同一个父类或者实现同一个接口,然后把ArrayList的泛型指定为这个父类/接口,这样就能把所有子类对象都放进去啦——这正是多态的核心优势:父类型引用可以指向子类型对象。
步骤1:定义共同的父类(或接口)
首先我们需要一个顶层的父类,比如叫Shape,可以定义一些所有形状都通用的方法(比如计算面积),用抽象类或者接口都可以,这里用抽象类举例:
// 抽象父类Shape,定义通用行为 public abstract class Shape { // 抽象方法,要求所有子类必须实现计算面积的逻辑 public abstract double getArea(); }
步骤2:实现各个子类
接下来让你的Rectangle和RightTriangle继承Shape,并实现父类的抽象方法:
// Rectangle类,继承Shape public class Rectangle extends Shape { private double width; private double height; // 构造方法 public Rectangle(double width, double height) { this.width = width; this.height = height; } // 实现父类的getArea方法 @Override public double getArea() { return width * height; } } // RightTriangle类,继承Shape public class RightTriangle extends Shape { private double base; private double height; // 构造方法 public RightTriangle(double base, double height) { this.base = base; this.height = height; } // 实现父类的getArea方法 @Override public double getArea() { return 0.5 * base * height; } }
步骤3:创建ArrayList并添加对象
现在就可以创建泛型为Shape的ArrayList,然后直接添加子类对象了,完全符合你想要的shape.add(new Rectangle(3, 2))这类操作:
import java.util.ArrayList; public class ShapeDemo { public static void main(String[] args) { // 创建泛型为Shape的ArrayList,能接收所有Shape的子类实例 ArrayList<Shape> shapes = new ArrayList<>(); // 添加Rectangle对象 shapes.add(new Rectangle(3, 2)); // 添加RightTriangle对象 shapes.add(new RightTriangle(2, 4)); // 遍历集合,统一调用getArea方法(多态的体现) for (Shape shape : shapes) { System.out.printf("当前形状的面积是:%.2f%n", shape.getArea()); } } }
额外注意:调用子类特有方法
如果之后你需要调用某个子类特有的方法(比如Rectangle的getWidth()),就需要先通过instanceof判断类型,再进行强制转换:
for (Shape shape : shapes) { if (shape instanceof Rectangle) { Rectangle rect = (Rectangle) shape; System.out.println("矩形的宽度是:" + rect.getWidth()); } }
另外,如果你没有办法定义共同的父类/接口,也可以用ArrayList<Object>来存储,但这种方式不推荐——因为取出对象时必须强制转换,而且没法统一调用通用方法,类型安全性也差很多,所以优先用共同父类/接口的方案。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

