对象如何隐式调用toString方法?

时间:2013-06-11 18:45:54

标签: java

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

5 个答案:

答案 0 :(得分:42)

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

请参阅:

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

System是一个类static字段out,类型为PrintStream。因此,您要调用PrintStream的{​​{3}}方法。

它是这样实现的:

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

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

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

在这里,您看到String.valueOf(Object)被调用。

答案 1 :(得分:6)

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

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

  

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

toString()是为数不多的方法之一(例如equals()hashCode()等),其中 隐式调用 程序化情况,如(只是命名一些)

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

答案 2 :(得分:4)

所有内容都继承自Object,因此如果您没有定义,则会调用Object上的toString

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

在java对象类中是每个类的超类。每当你传递给system.out.println的内部对象类到字符串方法的参数都会被excuted.it返回给出的类名@引用值但是按照我们的应用程序要求对象类到字符串方法将在集合中重写并且字符串class.it返回它们的内容。