为什么DATE_OF_MONTH是Calendar(Java API)中的静态final

Bad*_*est 1 java calendar

我正想通过Java API中Calendar类的源代码,并发现了很多变数,比如DAY_OF_MONTH,YEAR等被声明为static final.这让我觉得奇怪,因为我认为Calendar实例的日期应该是(1)特定于该实例,即非静态和(2)可更改(因此可以设置).任何人都可以澄清吗?谢谢!

tpd*_*pdi 13

这是一个显而易见的常数.它不是指本月的任何特定日期,而是指DAY_OF_MONTH 这个概念.

您可以使用它来指定要获取(或设置)日期的哪个元素.

例如,我想在一个月内添加(增加日历的日期):

    c.add ( Calendar.MONTH, 1 ) 
Run Code Online (Sandbox Code Playgroud)

我想补充一天:

   c.add ( Calendar.DAY_OF_YEAR, 1 ) ;
Run Code Online (Sandbox Code Playgroud)

我正在调用相同的函数,第一个参数是Calendar字段的清单常量,我希望递增/递减.(当然,递增/任何特定的领域递减可能更改其他领域:如果我添加一天2099年12月31日,该DAY_OF_MONTH,月和年字段都要改变)

替代方案是为每个字段设置不同的设置器,例如,

 addMonth( int n ) ;
 addDayOfYear( int n);
Run Code Online (Sandbox Code Playgroud)

这会使编码某些用例更加繁琐.


OP问:

任何人都可以告诉我当你调用cal.set(2010,8,2)时cal发生了什么,其中cal是一个日历?我想知道是编译器如何连接2 DATE_OF_MONTH,或者是2堆结束了,还是什么合格的变量名是2存储于其中.谢谢所有回答的人!

"严格"面向对象的答案是"作为客户端程序员使用日历而不是实现它们,您不需要了解日历的内部布局或算法".

真正的答案是Calendar是一个接口,因此任何特定的实现类都可以通过多种方式执行这些操作,只要实现遵循公共接口和 Calendar接口的语义即可.

例如,GregorianCalendar的实际实现可能是在内部将日期保留为自某个特殊日期以来的一些秒数,例如linux"时代"(1970年1月1日)或公历的第一个机构(10月15日15日) 1582年).

因此cal.set(2010, 8, 2)可能将年份乘以365*24*60*60,加上任何闰年,8用于查找到第七个月结束的秒数(再次,占闰日,如果有的话),2添加两天内的秒数等.


Boz*_*zho 5

这些是日历值的关键.通过调用获得值calendar.get(key).例如:

int dayOfMonth = concreteCalendar.get(Calendar.DAY_OF_MONTH);
Run Code Online (Sandbox Code Playgroud)