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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄星睿 中级黑马   /  2012-7-2 11:10  /  2226 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 庄星睿 于 2012-7-2 22:24 编辑

Calendar类是个抽象类,抽象类是不能实例化对象的,只能由其子类实例化,但Calendar.getInstance()方法,返回了一个Calendar对象,还可以调用其方法
Calendar c=Calenar.getInstance();
c.get(Calendar.YEAR);
c.add(Calendar.YEAR,-1);
我看源码了,用的不是单例模式,单例是隐藏了自己的构造方法,本身创建了对象,通过公共的public static Object getInstance()获取对象,但抽象类本身就不能创建对象的,那个Calendar.getInstance().他获取的的对象是谁创建的

搞明白了,学习的时候漏掉了 GregorianCalendar ,他是Calendar的子类,通过子类对象实例化后再调用方法
源码:
public static Calendar getInstance()
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
        cal.sharedZone = true;
        return cal;
    }
private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        Calendar cal = null;
        String caltype = aLocale.getUnicodeLocaleType("ca");
        if (caltype == null) {
            // Calendar type is not specified.
            // If the specified locale is a Thai locale,
            // returns a BuddhistCalendar instance.
            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 {
            // Unsupported calendar type.
            // Use Gregorian calendar as a fallback.
            cal = new GregorianCalendar(zone, aLocale);
        }
        return cal;
    }

6 个回复

倒序浏览
你想问什么? 没看懂
Calendar 表示日历
getInstance() 就是返回当前日历
get(Calendar.YEAR) 返回日历的年份
回复 使用道具 举报
因为getInstance()是一个静态方法,可以通过类名.方法名进行调用,通过这种方式可以获得Calendar抽象类的一个通用对象,所以它返回的是Calendar类型的一个对象,既然已经创建了一个对象,那么就可以调用Calendar类下所有已经实现了的方法。
回复 使用道具 举报
Calendar类是一个单例设计模式,提供了一个类方法 getInstance,以获得此类型的一个通用的对象。
Calendar类是抽象类,不能创建对象,Calendar c=Calenar.getInstance();这条语句并不是创建对象,
而是通过类的方法获取到的对象。
回复 使用道具 举报
Calendar是一个抽象类,但是它能提供一个方法,getInstance。。。返回一个日历对象。。

看一下API。。里面讲的很多~!
回复 使用道具 举报
李伟 发表于 2012-7-2 12:50
Calendar类是一个单例设计模式,提供了一个类方法 getInstance,以获得此类型的一个通用的对象。
Calendar ...

抽象类好像不能用单例吧, 单例是吧构造方法隐藏,自己创建对象,提供一个public static Object getIntance()方法获取到对象,但抽象类好像本身也不能创建对象吧
回复 使用道具 举报
当楼主遇到这种问题的时候, 可以看看源代码。
  1. public static Calendar getInstance(Locale aLocale)
  2.     {
  3.         Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
  4.         cal.sharedZone = true;
  5.         return cal;
  6.     }
复制代码
  1. private static Calendar createCalendar(TimeZone zone,
  2.                                            Locale aLocale)
  3.     {
  4.         // If the specified locale is a Thai locale, returns a BuddhistCalendar
  5.         // instance.
  6.         if ("th".equals(aLocale.getLanguage())
  7.             && ("TH".equals(aLocale.getCountry()))) {
  8.             return new sun.util.BuddhistCalendar(zone, aLocale);
  9.         } else if ("JP".equals(aLocale.getVariant())
  10.                    && "JP".equals(aLocale.getCountry())
  11.                    && "ja".equals(aLocale.getLanguage())) {
  12.             return new JapaneseImperialCalendar(zone, aLocale);
  13.         }            

  14.         // else create the default calendar
  15.         return new GregorianCalendar(zone, aLocale);       
  16.     }
复制代码
其实返回是Calendar这个类的子类GregorianCalendar对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马