对于int,类的实例变量的Java默认值未初始化为零

对于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

这是我在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"));
    }
}

我期望
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@2a139a55
print
方法重载并调用
.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());
}