E.g。
import java.util.*;
public class mainXX {
public static void main(String args[]){
System.out.println(new Date());
}
}
如果我运行此代码,我正在创建一个新的Date对象但不调用任何方法,它只调用默认构造函数,如下所示:
public Date(){ 此(System.currentTimeMillis的()); }
System.out.println如何从此声明中打印字符串日期(Tue Sep 27 12:04:42 EST 2011),因为构造函数无法返回值?
我知道这是一个简单的问题,但我无法弄清楚发生了什么。谢谢,m
答案 0 :(得分:5)
在println
上调用Object
时,会自动调用对象的toString()
方法。因此,基于当前系统时间构造新Date,然后调用Date.toString()
方法,返回String
。然后将字符串打印到控制台。
答案 1 :(得分:4)
你是正确的,构造函数本身不返回值,但通过将新运算符应用于构造函数“call”而形成的表达式,生成值。< / p>
换句话说,new
是一个运营商。表达式new C ( args )
在给定的参数上调用构造函数C
。 new
表达式的结果是新构造的对象。生成值的是new
运算符,而不是构造函数。 (我是技术性的并说“生产”而不是“回归”,因为我认为这符合你的问题。)
<强>附录强>
作为进一步的解释:构造函数,实际上不像方法那样“返回”对象。例如:
public class Point {
private double x;
private double y;
public Point (double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {return x;}
public double getY() {return y;}
@Override public String toString() {
return "(" + x + "," + y + ")";
}
}
方法getX
,getY
和toString
会返回值,因此在用于此类表达式时
p.getX()
返回一个值。
构造函数没有return语句。更重要的是,你不要直接调用它。那是你不能说
System.out.println(Point(1, 2));
那将是一个错误。相反,您使用“new-expression”,其形式为new
,应用于应用于参数列表的构造函数名称。这将调用构造函数并生成一个新对象。例如:
Point p = new Point(4, 3);
右侧是新创建的点对象。我所指出的只是构造函数本身没有返回任何东西;您必须应用new
运算符才能获得点对象。
因为new
表达式产生了一个对象,我们可以直接对它应用方法。以下都是可以接受的:
new Point(4, 3) // produces a point object
new Point(4, 3).getX() // produces 4
new Point(4, 3).getY() // produces 3
new Point(4, 3).toString() // produces "(4,3)"
正如其他回答者所指出的那样,在Java中,当您在需要字符串的上下文中使用对象时,会自动调用toString()
方法。所以
System.out.println(new Point(4, 3))
实际上会打印(4,3)
。
答案 2 :(得分:3)
只要需要对象的字符串表示,就会调用所有Java对象上可用的toString()
方法。
答案 3 :(得分:2)
Tom G不太正确。
System.out
是PrintStream
。
PrintStream.println
已重载,因此生成的值(日期Object
)的打印方式与其他类型不同。
根据Java API,这个:
print(Object)
,String.valueOf(Object)
(建议不是toString
),toString()
最后toString
(valueOf
)的结果是一个字符串,然后由PrintStream
打印,如文档所示。
答案 4 :(得分:0)
方法System.out.println();
以java中对象的值为目标,让它为字符串或整数或任何其他自定义对象。因此,当您尝试在任何对象上调用此方法时,将自动调用与该对象关联的toString()方法,从而生成该值。
希望这能清除你的怀疑。