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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马陈旭东 中级黑马   /  2012-6-5 07:11  /  2092 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是一条我觉得比较绕的的小问,我问了宿舍里的哥们都把他们绕晕了

Calendar c = Calendar.getInstance();//Calendar是抽象类,这是他获取实例的方法。

一般按我以前理解抽象类一般都是通过子类来创建实例的!不过我觉得它用方法来获取好像跟子类没什么关系!

求理清思路

2 个回复

正序浏览
我是这么理解的,
Calendar类是个抽象类,里边可以定义抽象方法和不抽象方法,
public static Calendar getInstance();这个方法的构成很可能是采用类似单例模式,返回一个Calendar 对象;
但是因为抽象方法不能new对象,它又去调用了private static Calendar createCalendar(TimeZone zone,Locale aLocale)方法,调用里边的机制去生成一个Calendar 的对象,里边的具体实现我就不是很了解,这是部分源码:
public static Calendar getInstance()
{
    Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
    cal.sharedZone = true;
    return cal;
}

private static Calendar createCalendar(TimeZone zone,
                   Locale aLocale)
{
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
        if ("th".equals(aLocale.getLanguage()) && ("TH".equals(aLocale.getCountry()))) {
                return new sun.util.BuddhistCalendar(zone, aLocale);
                }
        else if ("JP".equals(aLocale.getVariant()) && "JP".equals(aLocale.getCountry()) && "ja".equals(aLocale.getLanguage())) {
                        return new JapaneseImperialCalendar(zone, aLocale);
        }            
       
        // else create the default calendar
        return new GregorianCalendar(zone, aLocale);       
}
回复 使用道具 举报
查看源码后得之,是由子类实现的实例,具体源码如下:
  1. public static Calendar getInstance()
  2.     {
  3.         Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
  4.         cal.sharedZone = true;
  5.         return cal;
  6.     }
复制代码
然后去找createCalendar方法的内容,代码如下:
  1. private static Calendar createCalendar(TimeZone zone,
  2.                                            Locale aLocale)
  3.     {
  4.         Calendar cal = null;

  5.         String caltype = aLocale.getUnicodeLocaleType("ca");
  6.         if (caltype == null) {
  7.             // Calendar type is not specified.
  8.             // If the specified locale is a Thai locale,
  9.             // returns a BuddhistCalendar instance.
  10.             if ("th".equals(aLocale.getLanguage())
  11.                     && ("TH".equals(aLocale.getCountry()))) {
  12.                 cal = new BuddhistCalendar(zone, aLocale);
  13.             } else {
  14.                 cal = new GregorianCalendar(zone, aLocale);
  15.             }
  16.         } else if (caltype.equals("japanese")) {
  17.             cal = new JapaneseImperialCalendar(zone, aLocale);
  18.         } else if (caltype.equals("buddhist")) {
  19.             cal = new BuddhistCalendar(zone, aLocale);
  20.         } else {
  21.             // Unsupported calendar type.
  22.             // Use Gregorian calendar as a fallback.
  23.             cal = new GregorianCalendar(zone, aLocale);
  24.         }

  25.         return cal;
  26.     }
复制代码
由上面两段代码,可以看出是由子类实现的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马