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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林康 中级黑马   /  2012-6-12 17:27  /  1729 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马林康 于 2012-6-13 15:42 编辑

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

6 个回复

倒序浏览
Calendar不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance() 中所获得的实例其实就是一个 "GreogrianCalendar" 对象

GreogrianCalendar就是Calendar的子类,他实现了Calendar里面的抽象方法。
这个之前有问过的
回复 使用道具 举报
抽象类不能用new操作符   这里运用了多态  也就是说建立了Calendar父类引用的 子类对象
回复 使用道具 举报
就Calender类来说,他本身是个抽象类,有部分方法需要是抽象的
所以本身不能通过new的方法来实例化
需要借助于一些已经把抽象方法实现的子类来实例化
实例化方法都写在getInstance()方法里

如果你当对抽象方法的普遍实现(使用getInstance()来实例化)不能满足你的需求的时候
你就应该自己来实现它。比如:
public class CalenderEx extends Calender {
}
Calender cal = new CalenderEx();
回复 使用道具 举报
Calendar虽然是抽象类,但它里面有提供的静态的方法来获得Calendar,其实Calendar实例化方法都写在getInstance()方法里,只是我们看不到,但是系统能识别。当然,我们还可以通过对Calender的子类GregorianCalendar的实例化,调用父类的方法。 关于这个其实有很多资料都可以参考,我这也是一点点的意见。希望对你有所帮助
回复 使用道具 举报
郑冬 发表于 2012-6-12 17:37
Calendar不能直接通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInst ...

明白了 ,创建的是子类对象。但是好像抽象类中不能定义静态方法,
回复 使用道具 举报
淡然 中级黑马 2012-6-12 22:16:49
7#
抽象类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. }
复制代码
它使用了多态特性,创建并返回的实例其实是他子类的实例。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马