如何在println()内自动调用toString()

Ber*_*ard 3 java constructor

我刚开始学习Java.我对构造函数的了解是:

  1. 它将在初始化对象时自动运行.

  2. 构造函数的名称与类名相同.

现在,下面是我开始感到困惑的地方.

class Frog{

   public String toString() {
      return "Hello";
   }
}

public class App {

   public static void main(String[] args) {
      Frog frog1 = new Frog();
      System.out.println(frog1);
   }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:既然public String toString ()不是构造函数,那么为什么在运行程序时它的行为就像构造函数一样.我以为它只能在我从App班级打电话时才能运行.

Coo*_*tri 12

简答:调用堆栈中frog1.toString()使用公共方法调用. System.out.println(Object x)

但是怎么样?让我们一起找:)

看一下这个PrintStream类(System.out默认情况下哪个实例用作字段值)源代码及其println接受Object参数的实现:

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

StringvalueOf与参数方法Object的类型是:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
Run Code Online (Sandbox Code Playgroud)

objfrog1在你的情况下,其toString()方法被调用,并返回"Hello"String实例的控制台输出)

  • 究竟.`System.out.println(frog1)`意味着调用`toString()`方法.当你执行类似`final String aString ="这是一个"+ frog1;`时,会发生同样的情况 (2认同)
  • @Bernard 不,当您放入“frog1”时,只有具有确切名称 toString() 的方法才会被“System.out.println(Object obj);”调用,正如 _Cootri_ 所解释的那样。例如,尝试将 toString() 方法重命名为“test()”,并查看“System.out.println(frog1);”的输出如何变化。由于您有一个方法“public String toString()”,您基本上已经覆盖了默认对象的 toString() 方法。(所有类都会自动扩展 Object,从而可以使用一些默认的对象方法,例如 toString() 和 getType()。) (2认同)
  • 谢谢@KevinCruijssen,老实说,作为一名Java初学者,我无法真正理解Cootri发布的示例,直到KevinCruijissen通过更简单的解释阐明它.并且还要感谢所有帮助进一步解释的兄弟. (2认同)