Calendar(日历的抽象类)为何可以被实例化?

概念:java中已经把日历封装好了,我们直接使用。常用于统计报表中,例如:需要查看月账单,年账单等。 

 Calendar本身是一个抽象类,抽象类是不允许被实列化的。但是Calendar提供了一个
方法:static Calendar getInstance()来获取实例化的对象。

 代码案例:

import java.util.Calendar;
import java.util.Date;

public class CalendarTest {
	public static void main(String[] args) {
		//获取日历对象的子类对象。有多态
		Calendar c = Calendar.getInstance();
		//int get(int field)  根据指定的字段获取对应的值(字段:年/月/日 时/分秒 字段)
		int year = c.get(c.YEAR);
		int month = c.get(c.MONTH);
		int dayOfMonth = c.get(c.DAY_OF_MONTH);
		int hourOfDay = c.get(c.HOUR_OF_DAY);
		int minute = c.get(c.MINUTE);
		int second = c.get(c.SECOND);
		System.out.println(year+":"+(month+1)+":"+dayOfMonth+"  "+hourOfDay+"-"+minute+"-"+second);
		
	}
}

1:这里跟踪源码getInstance(),这里日历抽象类调用静态方法getInstance后, createCalendar继续调用构造方法

public static Calendar getInstance()
    {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
    }//JDK底层源码,这里日历抽象类调用静态方法getInstance后, createCalendar继续调用构造方法

2:调用createCalendar底层会去创建日历的子类对象  

  private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        CalendarProvider provider =
            LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
                                 .getCalendarProvider();
        if (provider != null) {
            try {
                return provider.getInstance(zone, aLocale);
            } catch (IllegalArgumentException iae) {
                // fall back to the default instantiation
            }
        }

        Calendar cal = null;

        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }

 这里我单独把JDK创建对象的源码写出来

 if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }

 从上图可以看到其实Calendar c = Calendar.getInstance();这句代码是获取的子类对象,利用多态传参,左边是父类,右边是子类。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值