为什么有些java类在构造时似乎会返回一个值?

为什么有些java类在构造时似乎会返回一个值?,java,class,return,Java,Class,Return,例如 如果我运行这段代码,我将创建一个新的日期对象,但不调用任何方法,它只调用默认构造函数,如下所示: 公开日期(){ 这个(System.currentTimeMillis()); } System.out.println如何从该声明中打印字符串日期(周二9月27日12:04:42 EST 2011),因为构造函数无法返回值 我知道这是一个简单的问题,但我不知道发生了什么。谢谢,当在对象上调用println时,将自动调用对象的toString()方法。因此,新日期基于当前系统时间构建,然后调用

例如

如果我运行这段代码,我将创建一个新的日期对象,但不调用任何方法,它只调用默认构造函数,如下所示:

公开日期(){ 这个(System.currentTimeMillis()); }

System.out.println如何从该声明中打印字符串日期(周二9月27日12:04:42 EST 2011),因为构造函数无法返回值


我知道这是一个简单的问题,但我不知道发生了什么。谢谢,当在
对象上调用
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()
方法。