对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的字段是静态的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值