Calendar创建对象及使用

本文详细介绍了Java中Calendar类的实例化方法,包括直接使用子类GregorianCalendar和通过Calendar.getInstance()方法获取实例的过程。解释了getInstance()方法如何通过多态返回Calendar子类对象,并讨论了其在资源管理和跨栈区域使用的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Calendar创建对象及使用

public class CalendarDemo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();// 一个静态方法,返回的是子类对象(多态)

        // 使用add方法
        cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
        cal.add(Calendar.YEAR, -3); // 减3年

        cal.set(Calendar.YEAR,1999);
        int year1 = cal.get(Calendar.YEAR);
        int month1 = cal.get(Calendar.MONTH)+1;
        int day1 = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year1 + "年" + month1 + "月" + day1 + "日"); // 2015年1月18日;
        Date date = cal.getTime();
        System.out.println(date);

    }
}

public abstract class Calendar:

getInstance()方法

public static Calendar getInstance()
{
        return createCalendar(TimeZone.getDefault(),Locale.getDefault(Locale.Category.FORMAT));
}

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;
                }
            }
        }
        if (cal == null) {
            // If no known calendar type is explicitly specified,
            // perform the traditional way to create a Calendar:
            // create a BuddhistCalendar for th_TH locale,
            // a JapaneseImperialCalendar for ja_JP_JP locale, or
            // a GregorianCalendar for any other locales.
            // NOTE: The language, country and variant strings are interned.
            if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                cal = new BuddhistCalendar(zone, aLocale);
            } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                       && aLocale.getCountry() == "JP") {
                cal = new JapaneseImperialCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        }
        return cal;
    }

getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的子类,创建了对象。

拿到抽象类的对象

方法一:
直接去找该抽象类的已实现的子类对象.
比如说现在我们所提到的 public abstract class Calendar
它就有已实现的子类GregorianCalendar,我们也是可以直接
Calendar rili = new GregorianCalendar();
这样我们就拿到了Calendar的对象.

方法二:
看该抽象类中是否有返回该方法实例的静态方法.
我们知道,不管这个类是否是抽象的,该类中的静态成员都是可以以 **“类.成员”**进行调用.(不用实例化该类的对象.)
而这正式另一种获取该类对象的方法,也就是该类中提供了静态方法,而且该方法的返回值就是这个类的对象.(当然,这种方法并不是所有的类中都有提供)
我们来看一下Calendar中所提供的静态方法中就有一个返回值为 static Calendar的静态方法"getInstance()".
所以说,我们想拿到Calendar的对象可以直接
Calendar rili = Calendar.getInstance();

Calendar中的getInstance():Calendar抽象父类,getInstance()子类
Calendar Cal=Calendar.getInstance();
Calendar 是抽象类不能通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance()中所获的实例其实就是一个“GreogrianCalendar”对象;
GreogrianCalendar就是Calendar 的子类,它实现了Calendar 里面的抽象方法。通过父类的引用来指向子类的实例间接地实现父类的实例化。同时,使用getInstance()有诸多好处:1.new一定要生成一个新的对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已经存在的引用给你使用,这在效能上优于new;2.new创建后只能当次使用,而getInstance()可以跨栈区域使用。所以getInstance()通常是创建static静态实例的方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值