A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵玮_Tom 中级黑马   /  2012-6-11 20:31  /  1712 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵玮_Tom 于 2012-6-11 21:08 编辑

java.util包中的Calendar类是抽象的,并且有一个静态方法是getInstance(),不难推断这个类采用了单例模式。但同时又发现该类有许多抽象方法,而有抽象方法的类是不能实例化的,对于这个类,是什么情况呢?有没有明白人给我讲讲?

3 个回复

倒序浏览
Calendar不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

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

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 付信榕 于 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();来获得一个实例化对象。
回复 使用道具 举报
谢谢各位帮忙解答,不胜感激
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马