黑马程序员技术交流社区

标题: 关于Calendar类的问题 [打印本页]

作者: 马林康    时间: 2012-6-12 17:27
标题: 关于Calendar类的问题
本帖最后由 马林康 于 2012-6-13 15:42 编辑

抽象类不能被实例化,怎么Calendar可以使用getInstance()方法实例化呢?

作者: 郑冬    时间: 2012-6-12 17:37
Calendar不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。
这个之前有问过的
作者: 葛奎    时间: 2012-6-12 17:38
抽象类不能用new操作符   这里运用了多态  也就是说建立了Calendar父类引用的 子类对象
作者: 王超    时间: 2012-6-12 17:44
就Calender类来说,他本身是个抽象类,有部分方法需要是抽象的
所以本身不能通过new的方法来实例化
需要借助于一些已经把抽象方法实现的子类来实例化
实例化方法都写在getInstance()方法里

如果你当对抽象方法的普遍实现(使用getInstance()来实例化)不能满足你的需求的时候
你就应该自己来实现它。比如:
public class CalenderEx extends Calender {
}
Calender cal = new CalenderEx();

作者: 郑传庆    时间: 2012-6-12 18:10
Calendar虽然是抽象类,但它里面有提供的静态的方法来获得Calendar,其实Calendar实例化方法都写在getInstance()方法里,只是我们看不到,但是系统能识别。当然,我们还可以通过对Calender的子类GregorianCalendar的实例化,调用父类的方法。 关于这个其实有很多资料都可以参考,我这也是一点点的意见。希望对你有所帮助
作者: 马林康    时间: 2012-6-12 21:32
郑冬 发表于 2012-6-12 17:37
Calendar不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInst ...

明白了 ,创建的是子类对象。但是好像抽象类中不能定义静态方法,
作者: 淡然    时间: 2012-6-12 22:16
抽象类Calendar 的直接子类是 GregorianCalendar
API文档:GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
再给你看一下Calendar类中有关的源代码:
  1. public static Calendar getInstance()
  2.     {
  3.         Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
  4.         cal.sharedZone = true;
  5.         return cal;
  6.     }


  7. private static Calendar createCalendar(TimeZone zone,
  8.                                            Locale aLocale)
  9.     {
  10.         // If the specified locale is a Thai locale, returns a BuddhistCalendar
  11.         // instance.
  12.         if ("th".equals(aLocale.getLanguage())//
  13.             && ("TH".equals(aLocale.getCountry()))) {
  14.             return new sun.util.BuddhistCalendar(zone, aLocale);//泰国佛历。将佛陀涅盘年数543年加上今的年数(例:543年+2009年+1年=2553年),新年过后增加一年计算,如此类推。
  15.         } else if ("JP".equals(aLocale.getVariant())
  16.                    && "JP".equals(aLocale.getCountry())
  17.                    && "ja".equals(aLocale.getLanguage())) {
  18.             return new JapaneseImperialCalendar(zone, aLocale);//小日本皇历
  19.         }            

  20.         // else create the default calendar
  21.         return new GregorianCalendar(zone, aLocale);//公历
  22. }
复制代码
它使用了多态特性,创建并返回的实例其实是他子类的实例。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2