我刚开始学习Java。我对构造函数的了解是:
初始化对象时会自动运行。
构造函数的名称与类名相同。
现在,下面是我开始感到困惑的地方。
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
类调用时运行。
答案 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();
}
在您的情况下, obj
为frog1
,调用其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
方法内部。
每当该对象与String
或System.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()
方法,因为它是类定义的一部分)。