概念:java中已经把日历封装好了,我们直接使用。常用于统计报表中,例如:需要查看月账单,年账单等。
Calendar本身是一个抽象类,抽象类是不允许被实列化的。但是Calendar提供了一个
方法:static Calendar getInstance()来获取实例化的对象。
代码案例:
import java.util.Calendar; import java.util.Date; public class CalendarTest { public static void main(String[] args) { //获取日历对象的子类对象。有多态 Calendar c = Calendar.getInstance(); //int get(int field) 根据指定的字段获取对应的值(字段:年/月/日 时/分秒 字段) int year = c.get(c.YEAR); int month = c.get(c.MONTH); int dayOfMonth = c.get(c.DAY_OF_MONTH); int hourOfDay = c.get(c.HOUR_OF_DAY); int minute = c.get(c.MINUTE); int second = c.get(c.SECOND); System.out.println(year+":"+(month+1)+":"+dayOfMonth+" "+hourOfDay+"-"+minute+"-"+second); } }
1:这里跟踪源码getInstance(),这里日历抽象类调用静态方法getInstance后, createCalendar继续调用构造方法
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}//JDK底层源码,这里日历抽象类调用静态方法getInstance后, createCalendar继续调用构造方法
2:调用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;
}
}
}
这里我单独把JDK创建对象的源码写出来
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;
}
从上图可以看到其实Calendar c = Calendar.getInstance();这句代码是获取的子类对象,利用多态传参,左边是父类,右边是子类。