You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建存储多种不同对象的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:47:38