我正在浏览 Java API 中的 Calendar 类源代码,并注意到有很多变量,例如DAY_OF_MONTH
、YEAR
等被声明为 static final
。这让我觉得很奇怪,因为我认为 Calendar 实例的日期应该是 (1) 特定于该实例的,即非静态的和 (2) 可变的(因此可以设置)。谁能澄清一下?谢谢!
最佳答案
这是一个 list 常数。它不是指一个月中的任何特定日,而是指 概念 DAY_OF_MONTH。
您可以使用它来指定要获取(或设置)日期的哪个元素。
例如,我想添加(将日历的日期增加)一个月:
c.add ( Calendar.MONTH, 1 )
我要加一天:
c.add ( Calendar.DAY_OF_YEAR, 1 ) ;
我正在调用相同的函数,第一个参数是我要递增/递减的日历字段的 list 常量。 (当然,任何特定字段的递增/递减可能会更改其他字段:如果我在 2099 年 12 月 31 日添加一天,则 DAY_OF_MONTH、MONTH 和 YEAR 字段将全部更改。)
另一种方法是为每个字段设置不同的 setter ,例如,
addMonth( int n ) ;
addDayOfYear( int n);
然而,这会使一些用例的编码变得更加乏味。
OP 要求:
Can anyone walk me through what happens, say, when you invoke cal.set(2010, 8, 2) where cal is a Calendar? What I'd like to know is how the compiler connects 2 to DATE_OF_MONTH, or where that 2 ends up in the heap, or what the qualified variable name is under which that 2 is stored. Thanks all who answered!
“严格的”面向对象的答案是,“作为使用日历而不是实现日历的客户端程序员,您不需要了解日历的内部布局或算法”。
真正的答案是 Calendar 是一个接口(interface),所以任何特定的实现类都可以通过多种方式做这些事情,只要实现符合公共(public)接口(interface)和 Calendar 的语义界面。
例如,GregorianCalendar 的实际实现可能是它在内部将日期保存为自某个特殊日期以来的秒数,例如 linux“纪元”(1970 年 1 月 1 日)或公历的第一个机构( 1582 年 10 月 15 日)。
所以 cal.set(2010, 8, 2)
可能将年份乘以 365 * 24 * 60 * 60,加上任何闰年,使用 8
计算到第七个月末的秒数(同样,考虑闰日,如果有的话),2 加上两天的秒数,依此类推。
关于java - 为什么日历中的 DATE_OF_MONTH 是静态最终的(Java API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391838/