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

时间:2015-11-08 11:00:27

标签: 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 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()方法。为什么在初始化新对象时默认调用此方法,即使没有被调用?

6 个答案:

答案 0 :(得分:8)

问题出在您的toString方法中。以下内容

((hour==0 || hour==12)?12:hour%12)

是,只要小时值为012,请打印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