Calendar calendar = Calendar.getInstance(); //①
  calendar.set(Calendar.YEAR, Integer.parseInt(year1)); //②
  calendar.set(Calendar.MONTH, Integer.parseInt(month1));问题1:Calendar不是抽象类吗?抽象类不是不能实例化吗? 如①,为什么Calendar还能实例化?问题2:如②,为了使用抽象类Calendar中的set()这个方法而去实例化一个对象,那这个类定义为抽象类还有什么意义?直接定义为普通实体类不就可以了吗?不解,望高人指教。

解决方案 »

  1.   

    这个不是实例化。这是在获取一个Calendar对象的引用,和实例化是不一样的。
      

  2.   

    并且,没有实例化abstract,这个set方法是Calendar对象的方法,直接调用,所以是静态。
      

  3.   

    1.getInstance()
    这个方法的名字是骗你的
    其实它在内部实例化了一个Calendar的实现
    而申明为Calendar的calendar 是可以指向这个实现的2.这样可以让你不知道到底是谁在做这件事情
    而以为是Calendar做的
    而这种方式可以使得以后的实现方便更改
    当然好处不止这么多
      

  4.   

    这个set()不是static的。他是通过抽象类的那个“对象”来调用的。
      

  5.   

    getInstance()
    这个方法的名字是骗你的
    其实它在内部实例化了一个Calendar的实现
    而申明为Calendar的calendar 是可以指向这个实现的
    -----------------------------------------------
    你讲的这个看的不是很懂。
    ///////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////2.这样可以让你不知道到底是谁在做这件事情
    而以为是Calendar做的
    ----------------------------------------
    那到底是谁做的?
    ///////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////而这种方式可以使得以后的实现方便更改
    当然好处不止这么多
    -------------------------------------
    你的话看的不明白。
    没看出来有什么好处。
      

  6.   

    1.假设CalendarImpl类是Calendar类的实现
    那么也许这里的calendar也许(只是说也许)是指向一个new了的CalendarImpl
    这是允许的2.他就是不想让你知道是谁做的
    如果你要是指Calendar类的话,我可以告诉你
    其实我也不知道他最后是调用谁的set方法
    这个是由具体代码决定的3.好处不需要你看出来
      

  7.   

    zdjray很感谢你1。你的1好象看明白点了。但感觉这样用抽象类的话,很混乱。那为什么不写一个实体类,继承自这个抽象类,然后再去做一些需要做的实现呢?其实我这个问题也就是你是说的那个“当然好处不只这么多”,可是我确实不知道好处在那。
    2。”如果你要是指Calendar类的话,我可以告诉你“ ,请讲。
      

  8.   

    建议楼主运行一下:System.out.println(Calander.getInstance().getClass().getName());就知道 Calander.getInstance() 得到的到底是一个什么类的对象了。
      

  9.   

    这个问题zdjray(PubSoft)已经说得很明白了,要是这样都还看不懂,那我建议你再去好好学习一下JAVA基础.学习JAVA,基础很重.
      

  10.   

    没错Calendar 是一个抽象类,它本身不能实例化,
    LZ可否知道 抽象类可以可写方法实体?这里Calendar用到了设计模式中的“工厂方法模式”。Calendar.getInstance();正是实工厂方法,他返回一个类的实例,在这里是Calendar实现类的实例对象。LZ应该了解继承,知道子类可以当做父类一样被使用吧?
    Calendar calendar = Calendar.getInstance();这句代码实际上是返回了一个Calendar子类的实例对象。然后把这个实例当做它的父类一样使用。getInstance()方法内的代码类似:public static Calendar getInstance(){
      return new CalendarImp();//CalendarImp表示 Calendar 的实现类。
    }至于为什么要这样做及好处是什么?
    这体实了面象接口编程的思想。想一想你怎么使用这个Calendar?我们把使用Calendar的方法叫做客户端调用。
    假设你在客户端代码直接使用Calendar 的实现类:
    CalendarImp calendar = new CalendarImp();
    一旦你有需要用另一个实现类替代这个,你需要修改这一句代码:
    CalendarOtherImp calendar = new CalendarOtherImp ();
    如果你的客户端代码中有N条这样的语句,你就需要修改N次。而使用“工厂方法模式”:
    Calendar calendar = Calendar.getInstance();
    这样使你不需要了解Calendar 的具体实现类,一旦Calendar 的实现类发生了改变,或者有另外的实现类来代替它,你可以不用修改你的客户端代码。你只需要修改getInstance()方法让它返回另一个子类实现就可以了。这样说LZ明白了吗?