我在Java中使用类GregorianCalendar
时遇到问题。
为什么方法get
会更改GregorianCalendar
类型的变量?
我做这项工作:
System.out.println(timestart);
second = timestart.get(GregorianCalendar.SECOND);
System.out.println(timestart);
输出结果为:
,HOUR_OF_DAY=15,MINUTE=37,SECOND=16,MILLISECOND=794140,ZONE_OFFSET=?,DST_OFFSET=?]
,HOUR=3,HOUR_OF_DAY=15,MINUTE=50,SECOND=30,MILLISECOND=0,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
为简单起见,我展示了输出的有趣部分。 我希望这两个印刷品给出相同的结果,但不是。
答案 0 :(得分:1)
查看GregorianCalendar和Calendar的源代码,您可以看到get
首先调用名为complete
的方法,该方法可以调用updateTime
或{ {1}} - 根据日历的时间戳计算分钟,秒等字段的方法。
每当更改值时,所有字段都将失效。字段似乎只是在访问时重新计算,大概是为了避免不必要的计算,如果你永远不会使用它们。所以基本上它是懒惰加载这些字段。
另一方面,computeFields
方法只打印所有值,而不重新计算任何内容。因此,在您的代码中,第一个输出可能会显示无效的旧值。如果是这种情况,那么您应该在第一个输出的省略部分看到类似toString
的内容。