首先是一段代码(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数组的初始化,以后有时间会研究。以上的过程和结论可能都有错误,希望懂得人能帮忙纠正一下。