抽象类的实例化(探究DateFormat的静态工厂如何实例化)

本文深入探讨了抽象类实例化的两种主要方式:通过子类实现和利用匿名内部类。以DateFormat为例,解析了其实例化背后的多态机制,并揭示了SimpleDateFormat在其中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道抽象类不能直接实例化,但是我们还是遇到一些能够实例化的抽象类,那他们到底是如何实例化的呢?根据我查阅到的资料,先总结一下,以后了解会更新。
抽象类

  • 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;

所以它也是通过第一种方法来实现的!父类指向子类!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨夜※繁华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值