黑马程序员技术交流社区

标题: Calendar类的一个小疑问<已解决> [打印本页]

作者: 赵玮_Tom    时间: 2012-6-11 20:31
标题: Calendar类的一个小疑问<已解决>
本帖最后由 赵玮_Tom 于 2012-6-11 21:08 编辑

java.util包中的Calendar类是抽象的,并且有一个静态方法是getInstance(),不难推断这个类采用了单例模式。但同时又发现该类有许多抽象方法,而有抽象方法的类是不能实例化的,对于这个类,是什么情况呢?有没有明白人给我讲讲?
作者: 杨天皓    时间: 2012-6-11 20:51
Calendar不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。
你可以参考一下API看一下。


作者: 付信榕    时间: 2012-6-11 21:05
本帖最后由 付信榕 于 2012-6-11 21:18 编辑

找到src里的源代码
public static Calendar getInstance(TimeZone zone,                                      Locale aLocale)
    {
        return createCalendar(zone, aLocale);
    }

private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        Calendar cal = null;

        String caltype = aLocale.getUnicodeLocaleType("ca");
        if (caltype == null) {
            
            if ("th".equals(aLocale.getLanguage())
                    && ("TH".equals(aLocale.getCountry()))) {
                cal = new BuddhistCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        } else if (caltype.equals("japanese")) {
            cal = new JapaneseImperialCalendar(zone, aLocale);
        } else if (caltype.equals("buddhist")) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            
            cal = new GregorianCalendar(zone, aLocale);
        }

        return cal;
}
可以看到getInstance()返回的GregorianCalendar的对象或者是BuddhistCalendar的对象(明显这两个类都不是抽象类)并不是由抽象类Calendar new的对象。所以可以用Calendar rightNow = Calendar.getInstance();来获得一个实例化对象。

作者: 赵玮_Tom    时间: 2012-6-11 21:08
谢谢各位帮忙解答,不胜感激




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2