如何在println()

时间:2016-03-21 10:27:30

标签: java constructor

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

  1. 初始化对象时会自动运行。

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

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

    class Frog{
    
       public String toString() {
          return "Hello";
       }
    }
    
    public class App {
    
       public static void main(String[] args) {
          Frog frog1 = new Frog();
          System.out.println(frog1);
       }
    }
    

    我的问题: 由于public String toString ()不是构造函数,因此在运行程序时它为什么会像构造函数一样运行。我以为它只能在我从App类调用时运行。

7 个答案:

答案 0 :(得分:12)

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

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

查看PrintStream类(默认情况下,该实例用作System.out字段值)源代码及其println实现接受Object参数:< / p>

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();
}
在您的情况下,

objfrog1,调用其toString()方法并返回"Hello"控制台输出的字符串实例)

答案 1 :(得分:3)

“toString”的行为与构造函数不同;调用它的原因是main方法中的第二行:

  System.out.println(frog1);

这会在frog1上调用toString

答案 2 :(得分:1)

当你调用PrintStream类print(obj)/ println(obj)方法然后在内部调用write方法时,arguement为String.valueOf(obj),如下所示:

public void print(Object obj) {
    write(String.valueOf(obj));
} 

现在String.valueOf(obj)执行调用String方法的任务,如下所示:

 /** 
 * Returns the string representation of the <code>Object</code> argument. 
 * 
 * @param   obj   an <code>Object</code>. 
 * @return  if the argument is <code>null</code>, then a string equal to 
 *          <code>"null"</code>; otherwise, the value of 
 *          <code>obj.toString()</code> is returned. 
 * @see     java.lang.Object#toString() 
 */ 
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
} 

答案 3 :(得分:0)

public String toString(){..}是类Object的方法,此处专门针对Frog类重写。此方法返回对象值表示。这是一种方法,而不是构造函数。请记住构造函数不能返回值。

有效的构造函数如下所示:

 public Frog(){}

答案 4 :(得分:0)

toString方法会覆盖Object.toString

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

所以当打电话

 System.out.println(frog1);

它要将对象转移到&#34;你好&#34;

答案 5 :(得分:0)

toString的用法是为您的班级提供一些有意义的表达。关于对象或类的描述可以在toString方法内部。

每当该对象与StringSystem.out.print等任何String s="abcd"+frog1;"引用的操作一起使用时,都会返回toString的内容。

如果未覆盖toString,它将返回对象类及其哈希码。请检查here

从您的代码中

  • Frog frog1 = new Frog(); =&gt;创建frog1类型的对象Frog
  • System.out.println(frog1); =&gt;输出String表示
    对象frog1

希望它能解释。

答案 6 :(得分:0)

我不确定你是否理解&#34;表现得像构造函数&#34;手段。当您执行new Frog()时,将调用Frog构造函数(默认构造函数,因为您还没有编写)。对.toString()的调用是在.println()调用内自动完成的,该调用位于调用构造函数后的行中。

您可能会感到困惑,因为toString()是您声明的唯一方法。但是,您缺少在类中自动存在隐式默认构造函数的知识。如果您要输入它,它将如下所示:

public Frog() {
    // default constructor does nothing
}

默认构造函数是&#34;表现得像构造函数&#34;。 toString()就像一个被另一个方法调用的方法(关键是println(Object o)肯定确定Object有一个toString()方法,因为它是类定义的一部分)。