Если вы посмотрите на исходный код , вы увидите, что метод stati c создает ссылку null
абстрактного суперкласса, который всегда становится спецификацией c реализации Calendar
перед возвратом.
Как вы можете видеть в приведенном ниже коде, это предложение относительно отцов, не знающих детей, не совсем верно, и я бы не стал следовать этому правилу при кодировании.
Все методы getInstance()
вызывают этот метод в конце, чтобы вернуть Calendar
:
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;
}
Таким образом, он всегда будет возвращать неабстрактную реализацию Calendar
, один из этих дочерних элементов:
BuddhistCalendar
GregorianCalendar
JapaneseImperialCalendar
Оба Japanese
и Gregorian
кажется, что включены в тот же пакет (чтобы отец знал о них), и, как Java 7, им пришлось импортировать календарь Buddhist
, как показывает эту строку в исходном коде:
import sun.util.BuddhistCalendar; //lol a sun package
Итак, с этим поведением проблем нет, может быть, просто какой-то бес Орты обязательны. Что касается вашего вопроса, эти три конкретных подкласса инициализируются методом stati c абстрактного суперкласса Calendar
, без каких-либо magi c позади ( раньше был iri sh лепрекон делает эти вещи за кулисами, но они удалили это в Java 1.5 ):
Calendar cal = null;
...
cal = new GregorianCalendar(zone, aLocale);
cal = new JapaneseImperialCalendar(zone, aLocale);
cal = new BuddhistCalendar(zone, aLocale);