对JAVA中Calendar类的理解

首先,Calendar是一个抽象类,无法被实例化,因此需要通过其子类访问其内部字段(内部字段含有年月日等)及方法

所以Calendar提供了静态方法getInstance,用于实例化一个Calendar的子类(底层原理是使用java的反射机制)

因此我们可以通过这个子类访问Calendar的内部字段以及方法

//实例化一个Calendar的子类,并把地址返回给c,这里用到了向上转型
Calendar c = Calendar.getInstance();
//下面是Calendar类的使用,获取当前的日历字段
System.out.println(c.get(Calendar.YEAR));  //年
System.out.println(c.get(Calendar.HOUR));  //时
System.out.println(c.get(Calendar.MINUTE));//分
System.out.println(c.get(Calendar.SECOND));//秒

很多人会疑惑既然已经创建了Calendar的子类并把地址传给了c,为什么不直接通过c.YEAR这种方式直接访问Calendar的内部字段从而获取当前的日历信息呢?我也是这样想的,于是就去看底层源码

可以看到,实际上Calendar类内部字段都是常量,在类加载的时候已经被初始化,因此,输出c.YEAR结果一定是1,同理输出c.MONTH的结果一定是2。那么Calendar类是怎么实现获取当前的日历信息的?下面是Calendar类中get方法的源码

可以看到,get方法通过一些算法获取当前的日历信息并存储到一个fields数组中,而get方法的返回值就是fields数组中指定字段的信息。

那么我们就可以总结一下了。Calendar类是通过其内部的get方法获取当前的日历信息的,因此我们需要想办法调用Calendar类中的get方法,由于get方法并不是静态方法,所以无法通过Calendar.get()这种方式调用,要想调用该方法,我们必须实例化一个Calendar对象,但是Calendar是一个抽象类,无法实例化,因此我们可以实例化一个它的子类通过继承的方式访问Calendar内部的get方法,于是就有了Calendar c = Calendar.getInstance();这段代码,这里getInstance方法用到了java的反射机制,我没有深究原理。之后直接通过c.get(c.YEAR)就可以获取当前的年份,当然c.get(Calendar.YEAR)也可以,因为Calendar的字段是静态的。

猜你喜欢

转载自blog.csdn.net/zaishuiyifang_ct/article/details/131152936