为什么通常的做法是重写 java 中的 toString() 方法来打印 class 的实例变量?

Why is it common practice to override the method toString() in java to print the instance variables of the class?

正如我一直在学习的那样,甚至一些 IDE 都将其嵌入其中,以覆盖 toString() 方法以打印出 class.

的所有实例变量

toString()定义在object.java定义如下:

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

通常的做法是将其覆盖为:

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

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

我们可以。但是其他 classes,他们对你的 subclasses 和你的 myNewToString 方法一无所知,怎么会知道如何打印一个 string that textually represents, in a concise but informative way, 任意 subclasses?

toString 方法旨在被重写以执行此操作。是的,它确实有默认行为,但不是很有用。它的作者希望你覆盖它。将其覆盖为 return 常用的做法更有用,但您不必这样做。 EmailAddress class 的 toString 方法可以 return

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

但它通常对 return 类似

的东西更有用
public String toString() {
    return localPart + "@" + domainName;
}

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

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

然后编译器将调用 o.toString() 以获得可以连接到“Hello”的字符串

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

意见:toString() 方法在一般情况下应该只用于调试 (Print/Log),而不是作为正常程序流程的一部分。