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方法?
答案 0 :(得分:2)
toString()
方法在调用printf
期间由API本身调用,因为您以String格式指定了%s
标识符。
System.out.printf("The constructor for this is %s\n", this);
^^
此方法使用类Formatter
格式化输出,并为%s
标识符引用its documentation(强调我的):
如果参数
arg
为null
,则结果为"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。