这是我在java教程中处理的一个例子。 我有一个没有构造函数的Time1类,因此我期望用默认值初始化为int,即零。
public class Time1 {
private int hour; // expected to be initialised with zero
private int minute; // expected to be initialised with zero
private int second; // expected to be initialised with zero
public void setTime(int hour, int minute, int second) {
if (hour < 0 || hour >= 24 || minute < 0 || minute >= 60 || second < 0 || second >= 60) {
throw new IllegalArgumentException("value out of range");
}
this.hour = hour;
this.minute = minute;
this.second = second;
}
public String toUniversalString() {
return String.format("%02d:%02d:%02d", hour, minute, second);
}
public String toString() {
return String.format("%d:%02d:%02d %s", ((hour == 0 || hour == 12) ? 12 : hour % 12), minute, second, (hour < 12 ? "AM" : "PM"));
}
}
现在我有了主要课程
public class Time1test {
public static void main(String[] args) {
Time1 thistime = new Time1();
System.out.println(thistime);
thistime.setTime(13, 22, 33);
System.out.println(thistime);
}
}
在使用System.out.println(thistime);
方法返回00:00:00之前我期待setTime()
,因为我没有使用任何方法重新格式化它,但是我得到输出为12:00: 00 AM,等于调用toString()
方法。为什么在初始化新对象时默认调用此方法,即使没有被调用?
答案 0 :(得分:8)
问题出在您的toString
方法中。以下内容
((hour==0 || hour==12)?12:hour%12)
是,只要小时值为0
或12
,请打印12,否则请打印hour % 12
。
致电时:
System.out.println(thistime);
打印结果与:
相同System.out.println(thistime.toString());
所以这就是调用toString
方法的原因。您可以编写类似((hour == 12) ? 12 : hour % 12)
的内容来修复它。
答案 1 :(得分:8)
如果你正在使用像eclipse这样的ide,你可能已经注意到你的方法toString()附近有一个标记overrides java.lang.Object.toString
。这是在您尝试打印对象时默认调用的方法。这看起来像
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
由于您在方法中有相同名称的自己的定义,因此它会被覆盖。如果您将自己的toString
方法重命名为其他方法,则可以注意到差异,输出类似于Time1@2a139a55
答案 2 :(得分:6)
当您为对象调用System.out.println(thistime);
时,将执行toString
方法,并打印它返回的字符串。
当toString
:
hours == 0
方法明确返回12
return String.format("%d:%02d:%02d %s", ((hour==0 || hour==12)?12:hour%12),minute, second, (hour<12?"AM":"PM"));
-------
答案 3 :(得分:4)
System.out.println需要一个String作为参数,因此它调用你的toString方法将你的Time1对象转换为一个String。由于你在那里的逻辑,你看到“12:00:00 AM”输出。
你可以做到
System.out.println(time1.toUniversalString());
获得您期望的输出;
答案 4 :(得分:4)
我期待System.out.println(thistime);在使用之前 setTime()方法返回00:00:00因为我没有使用任何方法 重新格式化,但我得到的输出是凌晨12点00分 等于调用toString()方法。为什么这种方法存在 默认情况下,在初始化新对象时调用,即使没有 要求?
当您打印对象(使用System.out.println(thistime)
时),默认情况下会调用其toString
方法(即使没有显式调用)。就这么简单。
答案 5 :(得分:0)
print
方法已重载,并为任何非原始的方法调用.toString()
。 print方法可以格式化原始值,但为任何toString()
子类调用Object
。