黑马程序员技术交流社区
标题:
Calendar类小疑问
[打印本页]
作者:
庄星睿
时间:
2012-7-2 11:10
标题:
Calendar类小疑问
本帖最后由 庄星睿 于 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;
}
作者:
yulu53
时间:
2012-7-2 11:59
你想问什么? 没看懂
Calendar 表示日历
getInstance() 就是返回当前日历
get(Calendar.YEAR) 返回日历的年份
作者:
王冰
时间:
2012-7-2 12:13
因为getInstance()是一个静态方法,可以通过类名.方法名进行调用,通过这种方式可以获得Calendar抽象类的一个通用对象,所以它返回的是Calendar类型的一个对象,既然已经创建了一个对象,那么就可以调用Calendar类下所有已经实现了的方法。
作者:
李伟
时间:
2012-7-2 12:50
Calendar类是一个单例设计模式,提供了一个类方法 getInstance,以获得此类型的一个通用的对象。
Calendar类是抽象类,不能创建对象,Calendar c=Calenar.getInstance();这条语句并不是创建对象,
而是通过类的方法获取到的对象。
作者:
胡大强
时间:
2012-7-2 14:36
Calendar是一个抽象类,但是它能提供一个方法,getInstance。。。返回一个日历对象。。
看一下API。。里面讲的很多~!
作者:
庄星睿
时间:
2012-7-2 20:05
李伟 发表于 2012-7-2 12:50
Calendar类是一个单例设计模式,提供了一个类方法 getInstance,以获得此类型的一个通用的对象。
Calendar ...
抽象类好像不能用单例吧, 单例是吧构造方法隐藏,自己创建对象,提供一个public static Object getIntance()方法获取到对象,但抽象类好像本身也不能创建对象吧
作者:
唐辉辉
时间:
2012-7-3 23:05
当楼主遇到这种问题的时候, 可以看看源代码。
public static Calendar getInstance(Locale aLocale)
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
cal.sharedZone = true;
return cal;
}
复制代码
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 if ("JP".equals(aLocale.getVariant())
&& "JP".equals(aLocale.getCountry())
&& "ja".equals(aLocale.getLanguage())) {
return new JapaneseImperialCalendar(zone, aLocale);
}
// else create the default calendar
return new GregorianCalendar(zone, aLocale);
}
复制代码
其实返回是Calendar这个类的子类GregorianCalendar对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2