个人笔记——关于Calendar.get()方法的实现(初步)

首先是一段代码(jdk1.8)

Calendar calender= new GregorianCalendar();
System.out.println(Calendar.YEAR);输出1
System.out.println(calender.get(Calendar.YEAR));输出当前年份
System.out.println(calender.get(1));输出当前年份
过程

在初步阅读源码后,发现Calendar.YEAR是常量1,而这又让我感到迷惑,calender.get(Calendar.YEAR)这一语句为何能直接得到当前年份?
经过阅读源码的理解,得到了初步的理解,记录如下:
在实例化GregorianCalendar对象的时候,会先用两个参数(默认当前的时区和地区)来初始化父类Calendar的相关属性,值得留意的是,初始化中会把把get方法中的关键数组fields给初始化。
随后子类GregorianCalendar调用了System.currentTimeMillis()来获得当前的系统时间,单位是毫秒,并把这个参数传给父类Calendar中的一个方法setTimeInMillis(long miles)。
在setTimeInMillis方法里使用了一个父类的抽象方法computeFields(),该方法是在GregorianCalendar类中实现,在调用这个无参方法的过程中会调用它的重载方法computeFields(int fieldMask, int tzMask)。
在这个重载方法中会用internalSet方法会往fields数组填充正确的时间。
最后返回到无参computeFields方法中调用setFieldsComputed验证(这句不确定,仅是猜测)。

结论

Calendar.get方法其实就是通过传入fields数组中指定位置的下标来获取想要的值,如Calendar.YEAR这个常量就是1,fields[1]存的就是当前时间的年份,所以传数值1也能得到。关键在于fields数组的初始化,以后有时间会研究。以上的过程和结论可能都有错误,希望懂得人能帮忙纠正一下。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值