繁体   English   中英

为什么普遍的做法是重写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 的所有实例变量。

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 class 的 toString 方法可以返回

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

但返回类似的东西通常更有用

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM