【问题标题】:Printing without calling method [duplicate]不调用方法打印[重复]
【发布时间】:2018-08-29 17:20:10
【问题描述】:

这似乎是一个非常基本的问题,但我不明白为什么当我什至没有调用 toString 方法时,它会打印在屏幕上,我只是实例化了一个 Car 对象。谢谢

public class Car {

    public void m1() { 

       System.out.println("car 1"); 

    }

    public void m2() { 

       System.out.println("car 2"); 

    }

    public String toString() { 

       return "vroom"; 

    }

 }




public static void main(String[] args) {

    Car myCar = new Car();

    System.out.println(myCar);

}

【问题讨论】:

标签: java object inheritance


【解决方案1】:

String.valueOf(Object)方法被隐式调用,见println(Object x)doc

打印一个对象,然后终止该行。此方法调用 首先 String.valueOf(x) 获取打印对象的字符串值,然后 表现得好像它调用了 print(String) 然后 println()。

以及String.valueOf(Object obj)doc

如果参数为null,则字符串等于“null”;否则, 返回 obj.toString() 的值。

【讨论】:

    【解决方案2】:

    因为没有System.out.println(Car) 方法,Java 编译器会选择最接近的匹配项,即System.out.println(Object)。这会调用 String.valueOf 你传入的内容以获取要打印的字符串版本。 String.valueOf 使用对象的toString 方法来获取字符串。从其文档中:

    返回:

    如果参数是null,那么字符串等于"null";否则返回obj.toString()的值。

    【讨论】:

      【解决方案3】:

      System.out.println(myCar) 这一行中,toSring 方法在内部被调用,因为println 首先调用String.valueOf(myCar) 来获取打印对象的字符串值。如果myCar 不是null,则valueOf 使用myCar.toString()

      所以整个流程是这样的:

      System.out.println(myCar) > String.valueOf(myCar) > myCar.toString()

      【讨论】:

      • 它总是调用toString方法吗?这就是我不明白的
      • 它总是在任何对象上调用 toString 方法。如果你不覆盖它,它将调用默认的 toString 方法。
      • @JoeVanjik 值得一提的是,只要参数不是null,它就会一直被调用
      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 2014-03-13
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多