Calendar 是抽象类,里面有抽象方法public abstract void add(int field, int amount)  。
 没有办法通过new方法创建实例,是可以通过getInstance() 获取一个实例(也是Calendar类型)。不明白California的代码中没有实现public abstract void add(int field, int amount)方法。但是Calendar 实例可以调用该方法。
也就是下面的代码可以成立:
 Calendar calendar = Calendar.getInstance();
 calendar.add(Calendar.MONTH, 1); // jdk代码中没有实现该方法,怎么可以调用
=============================================
请大家指教一下,谢谢

解决方案 »

  1.   

    我的理解是:
    Calendar类中的getInstance()方法的源代码为:
     public static Calendar getInstance()
        {
            Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
    cal.sharedZone = true;
    return cal;
        }
    通过createCalendar创造的Calendar对象cal已经实现了add()方法
      

  2.   

    说一个另外的问题:
    List list=new ArrayList();你见过吧?
    为什么这样定义?因为List是一个接口,有很多实现类  我们需要Arraylist的一些性质 当然要new它的对象当然你问的跟这个情况不大一样,我就是希望给你点提示 
      

  3.   

     Calendar类中的getInstance()方法返回的是格林日历,是一个字现了 add() 方法的一个类
      

  4.   

    ================================================
    谢谢你的回答,不过我不认为是这样的。在看Calendar类的源码的时候,并没有任何实现该方法的代码。我一开始猜该类应该和虚拟机相关的。就像Serialize这样的接口。不过这肯定不对
      

  5.   

    ==================================================
    谢谢你的关注,你上面说的就是接口编程。ArrayList已经实现了List定义的抽象方法。看看jdk文档就清楚了。我不知道是不是虚拟机会不会对这个类做了那些动作
      

  6.   

    ===========================================================
    谢谢这位mm的关注。不过jdk文档上说的明明白白,返回的就是Calendar 见 static Calendar getInstance() 使用默认时区和语言环境获得一个日历。 并没有返回格林日历 GregorianCalendar 这个类。这个类倒是实现了add()方法。
    祝mm情人节快乐
      

  7.   

    你看的只是Calendar的源码,我说的是createCalendar实现了add()方法,所以你得再去看createCalendar,源码如下: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 create the default calendar
            return new GregorianCalendar(zone, aLocale);
        }
    接着你就应该再去看sun.util.BuddhistCalendar和GregorianCalendar的源码,以此类推,总会找到实现了add()方法