我們都知道抽象類不能直接實例化,但是我們還是遇到一些能夠實例化的抽象類,那他們到底是如何實例化的呢?根據我查閱到的資料,先總結一下,以後瞭解會更新。
抽象類
- 1、方法都是靜態也有聲明爲抽象類的
- 2、方法裏邊有抽象方法
第一種:抽象類是父類,子類實現父類,通過多態實例化
package Abstract_Interface;
abstract class Fu{
public Fu(){
System.out.println("父類構造器");
}
public abstract void show();
}
class Zi extends Fu{
public Zi(){
System.out.println("子類構造器");
}
@Override
public void show(){
System.out.println("子類的show方法");
}
}
public class AbstractClass_Instance {
public static void main(String...s){
Fu fu = new Zi();
fu.show();
}
}
第二種,通過匿名內部類實現實例化(本質上屬於第一種)
package Abstract_Interface;
abstract class A{
private String s;
public void setS(String s){
this.s = s;
}
public String getS(){
return this.s;
}
public abstract void show();
public static A newInstance(){
return new A(){public void show(){
System.out.println("匿名內部類實際就是一個A的子類");
}};
}
}
public class AbstractClass_Instance2 {
public static void main(String[]args){
A a = A.newInstance();
a.show();
}
}
DateFormat的實例化探究
DateFormat是抽象類,繼承體系
我們通過它提供的靜態工廠方法可以實例化:
* static DateFormat getDateInstance() 獲取具有默認 FORMAT語言環境的默認格式樣式的日期格式化程序。
* static DateFormat getDateInstance(int style) 獲取具有默認 FORMAT語言環境的給定格式樣式的日期格式化程序。
* static DateFormat getDateInstance(int style, Locale aLocale) 獲取具有給定語言環境的給定格式樣式的日期格式化程序。
* static DateFormat getDateTimeInstance() 獲取具有默認 FORMAT語言環境的默認格式樣式的日期/時間格式化程序。
* static DateFormat getDateTimeInstance(int dateStyle, int timeStyle) 獲取具有默認 FORMAT語言環境的給定日期和時間格式樣式的日期/時間格式化程序。
* static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale) 獲取具有給定語言環境的給定格式樣式的日期/時間格式化程序。
* static DateFormat getInstance() 獲取一個默認的日期/時間格式化程序,它使用SHORT樣式作爲日期和時間。
猜想是通過SimpleDateFormat多態實例化——看源碼。本着探究精神!看了一下源碼
1、第一次看到了get函數
2、查看get()函數
private static DateFormat get(int timeStyle, int dateStyle,
int flags, Locale loc) {
if ((flags & 1) != 0) {
if (timeStyle < 0 || timeStyle > 3) {
throw new IllegalArgumentException("Illegal time style " + timeStyle);
}
} else {
timeStyle = -1;
}
if ((flags & 2) != 0) {
if (dateStyle < 0 || dateStyle > 3) {
throw new IllegalArgumentException("Illegal date style " + dateStyle);
}
} else {
dateStyle = -1;
}
LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(DateFormatProvider.class, loc);
DateFormat dateFormat = get(adapter, timeStyle, dateStyle, loc);
if (dateFormat == null) {
dateFormat = get(LocaleProviderAdapter.forJRE(), timeStyle, dateStyle, loc);
}
return dateFormat;
}
DateFormat dateFormat = get(adapter, timeStyle, dateStyle, loc);
3、get裏邊又是get()
4、此時探求到了一個叫DateFormatProvider的類,使用了其getInstance(),查閱該類的getInstance()方法
private DateFormat getInstance(int dateStyle, int timeStyle, Locale locale) {
if (locale == null) {
throw new NullPointerException();
}
// Check for region override
Locale rg = CalendarDataUtility.findRegionOverride(locale);
SimpleDateFormat sdf = new SimpleDateFormat("", rg);
Calendar cal = sdf.getCalendar();
try {
String pattern = LocaleProviderAdapter.forType(type)
.getLocaleResources(rg).getDateTimePattern(timeStyle, dateStyle,
cal);
sdf.applyPattern(pattern);
} catch (MissingResourceException mre) {
// Specify the fallback pattern
sdf.applyPattern("M/d/yy h:mm a");
}
// Check for timezone override
String tz = locale.getUnicodeLocaleType("tz");
if (tz != null) {
sdf.setTimeZone(
TimeZoneNameUtility.convertLDMLShortID(tz)
.map(TimeZone::getTimeZone)
.orElseGet(sdf::getTimeZone));
}
return sdf;
}
出現了!!
SimpleDateFormat sdf = new SimpleDateFormat("", rg);
.......
return sdf;
所以它也是通過第一種方法來實現的!父類指向子類!