对于int,类的实例变量的Java默认值未初始化为零
这是我在java教程中学习的一个示例。 我有一个Time1类,它并没有构造函数,所以我希望它被初始化为int的默认值,即零对于int,类的实例变量的Java默认值未初始化为零,java,methods,tostring,Java,Methods,Tostring,这是我在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
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"));
}
}
我期望
System.out.println(这次)
在使用setTime()
方法返回00:00:00之前,因为我没有使用任何方法重新格式化它,但是我得到的输出是12:00:00 am,这等于调用toString()
方法。为什么在初始化新对象时默认调用此方法,即使没有调用它?在调用System.out.println(这次)时
对于对象,执行toString
方法,并打印它返回的字符串
当hours==0时,您的toString
方法显式返回12:
return String.format("%d:%02d:%02d %s", ((hour==0 || hour==12)?12:hour%12),minute, second, (hour<12?"AM":"PM"));
-------
return String.format(“%d:%02d:%02d%s”),((hour==0 | | hour==12)?12:hour%12),分,秒,(hourSystem.out.println需要一个字符串作为参数,因此它调用toString方法将Time1对象转换为字符串。根据其中的逻辑,您可以看到“12:00:00 AM”输出
你能行
System.out.println(time1.toUniversalString());
获得您期望的输出
我期待System.out.println(这次);在使用
setTime()方法返回00:00:00,因为我没有使用任何方法
为了重新格式化它,我得到的输出是12:00:00 am
等于调用toString()方法。为什么要调用此方法
默认情况下,在初始化新对象时调用,即使没有
需要什么
当您打印对象时(您使用System.out.println(这次)
),默认情况下会调用其toString
方法(即使没有显式调用)。就这么简单。问题出在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)
的代码来修复它。如果您使用的是eclipse之类的ide,您可能会注意到方法toString()附近有一个标记也就是说,覆盖java.lang.Object.toString
。这是在尝试打印对象时默认调用的方法。如下所示
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
由于您在方法中使用相同的名称拥有自己的定义,因此它将被覆盖。如果您将自己的toString
方法重命名为其他方法,并且输出类似于Time1@2a139a55print
方法重载并调用.toString()
用于任何非基元的对象。print方法可以格式化基元值,但对任何对象
子类调用toString()
。谢谢你,Eran,但我没有调用此方法,那么为什么要应用此方法呢?@scott当你尝试打印它调用的对象时。
toString
。谢谢。回答我的问题。:)好吧,我没有注意到。单击它会打开另一个类,并且可以理解为什么我自己的自定义类会提供AM/PM
,而默认类会提供某种内存位置。为什么您希望00:00:00
?您希望Java自动调用toUniversalString
?基本上,当您传递de>Object
要打印,如下所示:System.out.println(Object)
,它实际上只做了System.out.println(Object.toString())
@user2357112,我不知道调用了什么方法以及为什么/如何调用,因此我提出了这个问题。谢谢Zizouz212它没有被转换。PrintStream.println()为对象
重载,其中调用了String.valueOf()
。这是错误的。PrintStream.println()
为对象
重载,其中显式调用了String.valueOf()
。
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}