为什么有些java类在构造时似乎会返回一个值?
例如 如果我运行这段代码,我将创建一个新的日期对象,但不调用任何方法,它只调用默认构造函数,如下所示: 公开日期(){ 这个(System.currentTimeMillis()); } System.out.println如何从该声明中打印字符串日期(周二9月27日12:04:42 EST 2011),因为构造函数无法返回值为什么有些java类在构造时似乎会返回一个值?,java,class,return,Java,Class,Return,例如 如果我运行这段代码,我将创建一个新的日期对象,但不调用任何方法,它只调用默认构造函数,如下所示: 公开日期(){ 这个(System.currentTimeMillis()); } System.out.println如何从该声明中打印字符串日期(周二9月27日12:04:42 EST 2011),因为构造函数无法返回值 我知道这是一个简单的问题,但我不知道发生了什么。谢谢,当在对象上调用println时,将自动调用对象的toString()方法。因此,新日期基于当前系统时间构建,然后调用
我知道这是一个简单的问题,但我不知道发生了什么。谢谢,当在
对象上调用println
时,将自动调用对象的toString()
方法。因此,新日期基于当前系统时间构建,然后调用Date.toString()
方法,返回字符串。然后将字符串打印到控制台。只要需要对象的字符串表示,就会调用所有Java对象上可用的toString()
方法。构造函数本身不返回值,而是将新运算符应用于构造函数形成的表达式,这是正确的“调用”是否产生一个值
换句话说,new
是一个运算符。表达式new C(args)
对给定参数调用构造函数C
。表达式的结果是新构造的对象。生成值的是new
运算符,而不是构造函数。(我说的是“生产”,而不是“返回”,因为我认为这符合你问题的精神。)
附录
进一步解释一下:构造函数实际上并不像方法那样“返回”对象。例如:
import java.util.*;
public class mainXX {
public static void main(String args[]){
System.out.println(new Date());
}
}
System.out.println(Point(1, 2));
方法getX
、getY
和toString
返回值,因此在这样的表达式中使用时
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 + ")";
}
}
返回一个值
构造函数没有返回语句。更重要的是,你不能直接调用它。也就是说,你不能说
这将是一个错误。相反,您使用的是一个“新表达式”,其形式为new
,应用于参数列表的构造函数名称。这将调用构造函数并生成一个新对象。例如:
import java.util.*;
public class mainXX {
public static void main(String args[]){
System.out.println(new Date());
}
}
System.out.println(Point(1, 2));
右边是一个新创建的点对象。我要指出的是,构造函数本身不会返回任何内容;您必须应用new
操作符才能获得点对象
因为new
表达式生成一个对象,所以我们可以直接对其应用方法。以下都是可以接受的:
Point p = new Point(4, 3);
正如其他回答者所指出的,在Java中,当您在需要字符串的上下文中使用对象时,会自动调用toString()
方法
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)"
实际上会打印(4,3)
Tom G不太正确
System.out
是一个打印流
PrintStream.println
被重载,因此生成的值(日期对象
)的打印方式与其他类型不同
根据报告,这是:
- 调用
打印(对象)
,其中
- 调用
String.valueOf(Object)
(不是建议的toString
),其中
- 如果对象不是null,则调用
toString()
最后一个toString
(valueOf
)的结果是一个字符串,然后由PrintStream
打印,如文档所示。方法System.out.println();
以java中对象的值为目标,让其为字符串、整数或任何其他自定义定义的对象。因此,当您尝试在任何对象上调用此方法时,将自动调用与该对象关联的toString()方法,从而生成该值。
希望这能消除您的疑虑。非常感谢,您不必明确拨打电话,这有点让人困惑。谢谢您的帮助。您能再解释一下吗?谢谢,m@mAndroid,当然,np,添加到了答案中。希望它能有所帮助。也许我对这个问题读得比原来更多?这个答案缺少解释我认为,toString()方法对于理解这里发生的事情至关重要。事实上,如果object不为null,String.valueOf(object)返回object的值。toString()方法返回的字符串显然是调用toString()的结果如果对象不为null,则对其执行。到字节(而不是字节数组)的转换由PrintStream处理,而不是valueOf()
方法。