抽象類的實例化(探究DateFormat的靜態工廠如何實例化)

我們都知道抽象類不能直接實例化,但是我們還是遇到一些能夠實例化的抽象類,那他們到底是如何實例化的呢?根據我查閱到的資料,先總結一下,以後瞭解會更新。
抽象類

  • 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()
**LocaleProviderAdapter?這個嗎**
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;

所以它也是通過第一種方法來實現的!父類指向子類!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章