重写类的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 }
关键结论
- 泛型只是做类型参数化,不会改变对象本身的方法调用逻辑;
- 控制台打印对象时的隐式
ToString()调用,是触发自定义输出的直接原因; - 多态特性保证了:只要对象的实际类型(这里是Person)重写了
ToString(),不管用什么类型引用它,都会执行重写后的方法。
内容的提问来源于stack exchange,提问作者Alireza Asadi
相关产品推荐
相关产品推荐

