为什么在java中重写方法toString()来打印类的实例变量是常见的做法



正如我一直在学习的,甚至一些IDE也嵌入了它,以覆盖toString()方法来打印类的所有实例变量。

object.java中定义的原始toString()定义如下:

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

通常的做法是将其重写为:

public String toString() {
return "className{" +"var1="+var1+", var2="+var2+'}';
}

为什么我们不保留toString()方法的原始功能,并使用该功能创建一个新方法(使用不同的名称(?

我们可以。但是,对于myNewToString方法的子类一无所知的其他类,如何知道如何打印一个以简洁但信息丰富的方式文本表示任意子类的字符串呢?

toString方法被设计为被重写以实现这一点。是的,它确实有默认行为,但不是很有用。它的作者希望你重写它。重写它以返回常用的方法更有用,但你不必这么做。EmailAddress类的toString方法可以返回

public String toString() {
return "EmailAddress{localPart = " + localPart + ", domainName = " + domainName + "}";
}

但返回这样的东西通常更有用

public String toString() {
return localPart + "@" + domainName;
}

重写toString((的原因是,每次将非String类型的对象添加到字符串中时,编译器都会隐式调用toString(。所以如果你有

MyObject o=new MyObject();
C="Hello " + o;

然后编译器将调用o.toString((以获得一个可以连接到"的字符串;你好">

我应该注意,在对o调用toString((之前,它会检查o是否为null。如果o为null,它只会生成字符串"空";

意见:toString((方法通常只用于调试(打印/日志(,而不是作为正常程序流的一部分。

最新更新