Calendar创建对象及使用
public class CalendarDemo {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();// 一个静态方法,返回的是子类对象(多态)
// 使用add方法
cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
cal.add(Calendar.YEAR, -3); // 减3年
cal.set(Calendar.YEAR,1999);
int year1 = cal.get(Calendar.YEAR);
int month1 = cal.get(Calendar.MONTH)+1;
int day1 = cal.get(Calendar.DAY_OF_MONTH);
System.out.print(year1 + "年" + month1 + "月" + day1 + "日"); // 2015年1月18日;
Date date = cal.getTime();
System.out.println(date);
}
}
public abstract class Calendar:
getInstance()方法
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(),Locale.getDefault(Locale.Category.FORMAT));
}
createCalendar()方法
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
CalendarProvider provider =
LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
.getCalendarProvider();
if (provider != null) {
try {
return provider.getInstance(zone, aLocale);
} catch (IllegalArgumentException iae) {
// fall back to the default instantiation
}
}
Calendar cal = null;
if (aLocale.hasExtensions()) {
String caltype = aLocale.getUnicodeLocaleType("ca");
if (caltype != null) {
switch (caltype) {
case "buddhist":
cal = new BuddhistCalendar(zone, aLocale);
break;
case "japanese":
cal = new JapaneseImperialCalendar(zone, aLocale);
break;
case "gregory":
cal = new GregorianCalendar(zone, aLocale);
break;
}
}
}
if (cal == null) {
// If no known calendar type is explicitly specified,
// perform the traditional way to create a Calendar:
// create a BuddhistCalendar for th_TH locale,
// a JapaneseImperialCalendar for ja_JP_JP locale, or
// a GregorianCalendar for any other locales.
// NOTE: The language, country and variant strings are interned.
if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
cal = new BuddhistCalendar(zone, aLocale);
} else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
&& aLocale.getCountry() == "JP") {
cal = new JapaneseImperialCalendar(zone, aLocale);
} else {
cal = new GregorianCalendar(zone, aLocale);
}
}
return cal;
}
getInstance()方法中返回的是createCalendar()方法,在这个createCalendar()方法中通过多态new了Calendar的子类,创建了对象。
拿到抽象类的对象
方法一:
直接去找该抽象类的已实现的子类对象.
比如说现在我们所提到的 public abstract class Calendar
它就有已实现的子类GregorianCalendar,我们也是可以直接
Calendar rili = new GregorianCalendar();
这样我们就拿到了Calendar的对象.
方法二:
看该抽象类中是否有返回该方法实例的静态方法.
我们知道,不管这个类是否是抽象的,该类中的静态成员都是可以以 **“类.成员”**进行调用.(不用实例化该类的对象.)
而这正式另一种获取该类对象的方法,也就是该类中提供了静态方法,而且该方法的返回值就是这个类的对象.(当然,这种方法并不是所有的类中都有提供)
我们来看一下Calendar中所提供的静态方法中就有一个返回值为 static Calendar的静态方法"getInstance()".
所以说,我们想拿到Calendar的对象可以直接
Calendar rili = Calendar.getInstance();
Calendar中的getInstance():Calendar抽象父类,getInstance()子类
Calendar Cal=Calendar.getInstance();
Calendar 是抽象类不能通过new对象,但是提供的静态getInstance()就是给Calendar创建对象。
从Calendar.getInstance()中所获的实例其实就是一个“GreogrianCalendar”对象;
GreogrianCalendar就是Calendar 的子类,它实现了Calendar 里面的抽象方法。通过父类的引用来指向子类的实例间接地实现父类的实例化。同时,使用getInstance()有诸多好处:1.new一定要生成一个新的对象,分配内存;getInstance()则不一定要再次创建,它可以把一个已经存在的引用给你使用,这在效能上优于new;2.new创建后只能当次使用,而getInstance()可以跨栈区域使用。所以getInstance()通常是创建static静态实例的方法;