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

如何创建重写toString方法的匿名类对象数组或集合

创建带自定义toString的匿名类对象集合/数组

嘿,我来帮你搞定这个需求!其实核心就是利用匿名类的特性——直接继承MyClass并重写toString,然后把这些匿名类实例塞进集合或者数组里就行,完全符合多态的规则。

先看完整的集合示例代码

假设你的MyClass有构造器和对应的getter方法,下面是直接可用的代码:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 定义存储匿名类对象的List,类型还是MyClass(多态支持)
        List<MyClass> customToStringList = new ArrayList<>();

        // 添加第一个匿名类对象,自定义toString格式
        customToStringList.add(new MyClass("Alice", "Smith", 30) {
            @Override
            public String toString() {
                // 这里写你想要的格式,比如和原类不同的排版
                return String.format("姓名: %s %s, 年龄: %d", getFirstName(), getLastName(), getAge());
            }
        });

        // 添加第二个匿名类对象,用另一种格式
        customToStringList.add(new MyClass("Bob", "Johnson", 25) {
            @Override
            public String toString() {
                return String.format("[%s] %s (%d岁)", getLastName(), getFirstName(), getAge());
            }
        });

        // 遍历集合,看看自定义toString的效果
        for (MyClass item : customToStringList) {
            System.out.println(item);
        }
    }
}

// 你的MyClass示例(带构造器和getter)
class MyClass {
    private String firstName;
    private String lastName;
    private int age;

    public MyClass(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    public int getAge() { return age; }

    // 原toString方法
    @Override
    public String toString() {
        return String.format("%10s%12s%12d", getFirstName(), getLastName(), getAge());
    }
}

数组的写法也类似

如果需要数组而不是集合,代码结构差不多:

// 定义MyClass类型的数组
MyClass[] customArray = new MyClass[2];

// 给数组元素赋值匿名类对象
customArray[0] = new MyClass("Charlie", "Brown", 35) {
    @Override
    public String toString() {
        return String.format("%s %s - %d", getFirstName(), getLastName(), getAge());
    }
};

customArray[1] = new MyClass("Diana", "Prince", 28) {
    @Override
    public String toString() {
        return String.format("Age: %d | Name: %s", getAge(), getFirstName() + " " + getLastName());
    }
};

// 遍历数组验证
for (MyClass item : customArray) {
    System.out.println(item);
}

几个关键注意点

  • 多态兼容性:匿名类是MyClass的子类实例,所以可以直接存入List<MyClass>或MyClass[],完全没问题。
  • 自定义灵活性:每个匿名类对象可以有独立的toString实现,你可以给不同的对象设置不同的格式。
  • 复用建议:如果多个对象需要相同的toString逻辑,别重复写匿名类——不如单独定义一个MyClass的子类,然后创建该子类的对象,这样更简洁易维护。
  • 外部变量访问:匿名类可以访问外部的final变量(或者Java 8+中实际上不可变的变量),如果你的toString需要用到外部参数的话。

内容的提问来源于stack exchange,提问作者Pouria Mohseni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:19