【问题标题】:Why is it common practice to override the method toString() in java to print the instance variables of the class?为什么在java中重写toString()方法来打印类的实例变量是常见的做法?
【发布时间】:2020-10-27 14:59:54
【问题描述】:

正如我一直在学习的那样,甚至一些 IDE 都将其嵌入其中,以覆盖 toString() 方法以打印出该类的所有实例变量。

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

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

通常将其覆盖为:

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

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

【问题讨论】:

  • 这对于基本的调试和日志记录很有用。在试图找出应用程序的状态时,您更愿意在控制台或日志语句中看到哪个打印? toString 被覆盖的原因使用新方法是因为当对象被评估为字符串时会调用 toString。例如System.out.println(object) 将调用 toString 方法。
  • "重写java中的toString()方法来打印类的实例变量?吹毛求疵,但 toString 不应该 打印 任何东西。它应该返回 表示对象状态的字符串(它的数据,以及它所代表的内容)。如何以及何时打印取决于班级的用户。
  • oop 的优点之一是多态性。为什么要扔掉?通过覆盖 toString(),它会在任何调用 toString() 的地方都以这种方式出现。

标签: java tostring


【解决方案1】:

我们可以。但是,其他对您的 myNewToString 方法的子类一无所知的类如何知道如何打印string that textually represents, in a concise but informative way, 任意子类?

toString 方法被设计为被覆盖来做到这一点。是的,它确实具有默认行为,但它不是很有用。它的作者希望你覆盖它。覆盖它以返回通常实践的内容更有用,但您不必这样做。 EmailAddress 类的 toString 方法可以返回

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 2021-04-16
      • 2020-08-02
      • 2014-01-12
      • 1970-01-01
      • 2011-11-13
      • 2012-10-24
      • 2014-09-24
      • 2011-07-16
      相关资源
      最近更新 更多