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

时间:2011-09-27 02:10:45

标签: java class return

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

5 个答案:

答案 0 :(得分:5)

println上调用Object时,会自动调用对象的toString()方法。因此,基于当前系统时间构造新Date,然后调用Date.toString()方法,返回String。然后将字符串打印到控制台。

答案 1 :(得分:4)

你是正确的,构造函数本身不返回值,但通过将新运算符应用于构造函数“call”而形成的表达式,生成值。< / p>

换句话说,new是一个运营商。表达式new C ( args )在给定的参数上调用构造函数Cnew表达式的结果是新构造的对象。生成值的是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 + ")";
    }
}

方法getXgetYtoString会返回值,因此在用于此类表达式时

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.outPrintStream

PrintStream.println已重载,因此生成的值(日期Object)的打印方式与其他类型不同。

根据Java API,这个:

  • 调用print(Object)
  • 调用String.valueOf(Object)(建议不是toString),
  • 如果对象不为空,则调用toString()

最后toStringvalueOf)的结果是一个字符串,然后由PrintStream打印,如文档所示。

答案 4 :(得分:0)

方法System.out.println();以java中对象的值为目标,让它为字符串或整数或任何其他自定义对象。因此,当您尝试在任何对象上调用此方法时,将自动调用与该对象关联的toString()方法,从而生成该值。 希望这能清除你的怀疑。