【问题标题】:How an object will call toString method implicitly?对象如何隐式调用 toString 方法?
【发布时间】:2013-06-11 18:45:54
【问题描述】:

如果我正在打印该类的一个对象,那么它正在打印toString() 方法实现,即使我没有编写toString() 方法,那么实现是什么,它如何在内部调用toString()

【问题讨论】:

  • 打印toString()方法实现是什么意思?

标签: java


【解决方案1】:

你没有明确地调用toString(),但隐含地你是:

见:

System.out.println(foo); // foo is a non primitive variable

System 是一个类,具有static 字段out,类型为PrintStream。所以你正在调用PrintStreamprintln(Object) 方法。

它是这样实现的:

   public void println(Object x) {
       String s = String.valueOf(x);
       synchronized (this) {
           print(s);
           newLine();
       }
   }

正如我们所见,它正在调用 String.valueOf(Object) 方法。
这实现如下:

   public static String valueOf(Object obj) {
       return (obj == null) ? "null" : obj.toString();
   }

你看,toString() 被调用了。

【讨论】:

    【解决方案2】:

    Java 中的每个对象 IS-A(n) Object 也是如此。因此,如果一个类没有提供 toString() 实现,则默认的 Object.toString() 会自动调用。

    Object.toString()默认实现 只是打印对象的类名,后跟对象的哈希码,这不是很有帮助。因此,通常应该重写 toString() 以提供对象运行时状态的更有意义的字符串表示。

    即使我没有编写 toString() 方法,那么实现是什么,它是如何在内部调用 toString() 的?

    toString() 是在某些编程情况下(例如,仅命名几个)

    • 使用println()打印对象
    • 打印对象的Collection(在所有元素上调用toString()
    • 与字符串连接(如strObj = "My obj as string is " + myObj;

    【讨论】:

      【解决方案3】:

      所有东西都继承自 Object,所以如果你没有定义 Object 上的 toString,就会被调用。

      【讨论】:

      • 一个方法只有在我们显式调用时才会被调用,但是这里如果我们打印一个对象,怎么可能调用toString()呢?
      • @MarounMaroun 你的意思是 Primitives 类型不是从 Object 类继承的? Object 类有原始类型吗?
      • @AsifMushtaq 没错。 Object 类没有原始类型,但有包装器 - 查找 IntegerDouble..
      【解决方案4】:

      toString() 方法存在于 Object 类中,因此当您将 obj 放入 System.out.println(obj); 时,它会隐含地调用 Object 类中存在的 toString() 方法,因为每个用户创建的类都将隐式继承 Object 类因此,作为您新创建的类,这意味着 toString() 在您的类中可用,因此它将打印例如:“PkgNamePackage.Classname@12cf4” 但是,如果您明确覆盖 toString 方法并提供您自己的实现,那么它将写入您在 Overriden tostring method(); 中提供的字符串; 例如:

      public class DogArray {
          @Override
          public String toString() {
              return "Im the newly created Object";
          }
      
          public static void main(String args[]) {
              DogArray d1 = new DogArray();
              System.out.println(d1);
          }
      }
      
      output: Im the newly created Object
      

      【讨论】:

        【解决方案5】:

        在 java 中,对象类是每个类的超类。每当您将参数传递给 system.out.println 内部对象类到字符串方法时,它将被执行。它返回给定的类名@引用值,但根据我们的应用程序要求对象类到字符串方法将在集合和字符串类中覆盖。它返回它们的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-31
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 2013-04-13
          • 1970-01-01
          • 2016-12-23
          • 2016-06-19
          相关资源
          最近更新 更多