使用构造函数和“this”对代码输出的Java解释

时间:2016-01-01 10:01:09

标签: java object constructor tostring

public class potpie {
    public int month;
    public int day;
    public int year;

public static void main(String[] args) {
    potpie potObject = new potpie(4,5,6);
}

public potpie(int m, int d, int y){
    month = m;
    day = d;
    year = y;

    System.out.printf("The constructor for this is %s\n", this);
}


public String toString(){
    return String.format("%d/%d/%d", month, day, year);
}
}

我正在观看有关java的视频教程,他编写了这段代码。但我不明白他为什么打印出来的解释

The constructor for this is 4/5/6

我只是不明白为什么使用toString方法?

4 个答案:

答案 0 :(得分:2)

toString()方法在调用printf期间由API本身调用,因为您以String格式指定了%s标识符。

System.out.printf("The constructor for this is %s\n", this);
                                               ^^

此方法使用类Formatter格式化输出,并为%s标识符引用its documentation(强调我的):

  

如果参数argnull,则结果为"null"。如果arg实现Formattable,则会调用arg.formatTo否则,通过调用arg.toString() 获得结果。

答案 1 :(得分:1)

在类中重写toString方法时。它在类的构造对象上调用了toString方法。

如果你不覆盖它,那么输出是,类名,然后是'at'符号,最后是对象构造对象的hashCode,如

The default toString() method in Object prints “class name @ hash code"

在这里你打印:

System.out.printf("The constructor for this is %s\n", this);

这次调用toString:

String.format("%d/%d/%d", month, day, year)

您的输出如下:  System.out.printf("The constructor for this is %s\n", {toString call});

最后,

The constructor for this is 4/5/6

答案 2 :(得分:1)

构造函数内的this引用当前对象"正在构建",potpie

sysout 函数自动调用传入对象的toString()方法。如果对象的类没有覆盖toString方法,则可能会得到Object"classname@HexNumber"

// Behind the scenes
System.out.printf("The constructor for this is %s\n", this.toString());

答案 3 :(得分:0)

potpie potObject = new potpie(4,5,6);

它将使用值(4,5,6)调用public potpie(int m, int d, int y)方法;

然后将m,d和y的值分配给月,日,年变量 这用于类,方法等的调用当前object

然后他们编写toString()方法来格式化月份日期和年份。 它将是%d的格式,返回/date/month/year

  • 默认的toString()方法包含“classname @hash code of class”,例如test @ 45689。