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

重写类的ToString()方法后输出结果的原因咨询

重写ToString()影响泛类print输出的原因解析

核心逻辑:多态+隐式方法调用

所有Java/C#的类都继承自顶层父类(Java是Object,C#是System.Object),这个父类自带一个默认的ToString()方法,默认返回类名@哈希码格式的字符串,比如Person@7852e922。

当你在Person类里重写ToString()后,只要调用这个Person对象的ToString()方法,不管是直接调用还是隐式触发,都会执行你自定义的逻辑——这是面向对象的多态特性决定的:子类重写父类方法后,实际执行的是子类的实现,和引用该对象的类型(包括泛型类型)无关。

为什么泛类的print方法会触发这个效果?

你的泛型类MyClass<T1>的print方法,本质上在打印字段a时,会隐式调用a.ToString():

  • 比如Java里的System.out.println(a),底层会先调用String.valueOf(a),而这个方法的逻辑是:如果对象非空,就调用它的ToString(),再返回结果;
  • C#里的Console.WriteLine(a)同理,底层也会自动调用对象的ToString()方法生成输出字符串。

举个代码实例(以Java为例):

// 重写了ToString()的Person类
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "用户:" + name + ",年龄:" + age;
    }
}

// 泛型类MyClass<T1>
public class MyClass<T1> {
    private T1 a;

    public MyClass(T1 a) {
        this.a = a;
    }

    public void print() {
        System.out.println(a); // 这里隐式调用了a.toString()
    }
}

// main方法
public static void main(String[] args) {
    Person class1 = new Person("张三", 28);
    MyClass<Person> myObj = new MyClass<>(class1);
    myObj.print(); // 输出:用户:张三,年龄:28
}

关键结论

  1. 泛型只是做类型参数化,不会改变对象本身的方法调用逻辑;
  2. 控制台打印对象时的隐式ToString()调用,是触发自定义输出的直接原因;
  3. 多态特性保证了:只要对象的实际类型(这里是Person)重写了ToString(),不管用什么类型引用它,都会执行重写后的方法。

内容的提问来源于stack exchange,提问作者Alireza Asadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:14