【问题标题】:Java default value of instance variables of a class not initialized to zero for int一个类的实例变量的 Java 默认值未初始化为 int 的零
【发布时间】:2015-11-08 11:00:26
【问题描述】:

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

在使用 setTime() 方法之前,我期待 System.out.println(thistime); 返回 00:00:00,因为我没有使用任何方法重新格式化它,但是我得到的输出是 12:00:00 AM,即等于调用toString() 方法。为什么在初始化新对象时默认调用此方法,即使没有被调用?

【问题讨论】:

  • 你为什么期待00:00:00?您是否期望 Java 会自动调用 toUniversalString
  • 基本上,当你传递一个Object 来打印时,像这样:System.out.println(Object),它真的只是System.out.println(Object.toString())
  • @user2357112,我不知道正在调用什么方法以及为什么/如何,因此这个问题。谢谢 Zizouz212

标签: java methods tostring


【解决方案1】:

如果您使用 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

【讨论】:

  • 好吧,我没注意到。单击它会打开另一个类,并理解为什么我自己的自定义类提供AM/PM 而默认的类提供某种内存位置。
【解决方案2】:

问题出在您的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)之类的东西来修复它。

【讨论】:

  • 它没有被转换。 PrintStream.println()Object 重载,其中调用了 String.valueOf()
【解决方案3】:

当您为您的对象调用System.out.println(thistime); 时,您的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"));

                                          -------

【讨论】:

  • 谢谢Eran,但我没有调用这个方法,为什么要应用这个方法?
  • @scott 当你尝试打印一个对象时,它会调用toString
  • 谢谢。回答我的问题。 :)
【解决方案4】:

System.out.println 需要一个字符串作为参数,因此它会调用您的 toString 方法将您的 Time1 对象转换为字符串。由于您在其中的逻辑,您会看到“12:00:00 AM”输出。

你可以的

System.out.println(time1.toUniversalString());

得到你期望的输出;

【讨论】:

    【解决方案5】:

    我期待 System.out.println(thistime);在使用之前 setTime() 方法返回 00:00:00 因为我没有使用任何方法 重新格式化它,但是我得到的输出是 12:00:00 AM 等于调用 toString() 方法。为什么这个方法是 在初始化新对象时默认调用,即使没有 需要吗?

    当您打印对象时(您使用System.out.println(thistime) 执行此操作),默认情况下会调用其toString 方法(即使没有显式调用)。就这么简单。

    【讨论】:

    • 这是错误的。 PrintStream.println()Object 重载,其中 String.valueOf() 被显式调用。
    【解决方案6】:

    print 方法被重载并调用.toString() 来处理任何非原始的东西。 print 方法可以格式化原始值,但为任何Object 子类调用toString()

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多