抽象类NumberFormat - 对getInstance()非常困惑

Ale*_*lex 4 java abstract-class instantiation

我是Java的新手,我有一个初学者的问题:

NumberFormat是一个抽象类,所以我假设我不能创建它的实例.但是有一种getInstance()允许我这样做 的公共静态(工厂?)方法

NumberFormat nf = NumberFormat.getInstance();  
Run Code Online (Sandbox Code Playgroud)

我很困惑.如果有人能给我提示,我会很高兴:

  1. 如果有一个公共方法来获取这个抽象类的实例,为什么我们还没有一个构造函数呢?
  2. 这是一个抽象的类; 我们怎么能有这个静态方法给我们一个类的实例?
  3. 为什么选择这样的设计?如果我假设它有可能有一个抽象类的实例(???),我不明白为什么这个类应该是抽象的.

谢谢.

Joe*_*oey 8

  1. 该类是抽象的,因为它是Java中每种数字格式的基类(DecimalFormat例如,这包括).拥有一个基本未知数字格式的构造函数是没有用的.
  2. getInstance()方法是所谓的工厂方法.它返回当前语言环境的匹配数字格式.因为什么样的子类在编译时需要它不知道,它返回一个NumberFormat,但是,例如本身,将是一个分型,很明显(因为你不能创建抽象类的实例).
  3. 这种设计使您可以灵活确定在运行时返回的正确子类实例,而无需在设计/编译时过多地设计该设计.静态方法不受抽象的限制,因此类可以作为具体实现的工厂抽象超类型.如果不是这种情况,你可能会有一个NumberFormatFactory具有工厂方法的地方.


Jac*_*ack 8

实际上你可以从中获得什么

public static final NumberFormat getInstance()
Run Code Online (Sandbox Code Playgroud)

是什么,是ALSO一个NumberFormat,但它是它的一个子类的具体实例.

你不能以任何方式实例化一个抽象类,以便该方法不能返回一个普通的NumberFormat但至少是一个NumberFormat.在这种情况下,该方法用于获取您的语言环境的默认格式化程序,它可能是它的一个DecimalFormat或一些变体

在其文档中DecimalFormat指出:

要获取特定区域设置的NumberFormat(包括默认区域设置),请调用NumberFormat的工厂方法之一,例如getInstance().通常,不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回除DecimalFormat之外的子类.

结束:你可以肯定,如果它是抽象的,那么你就无法实例化它,Java本身也不能......因为声明缺少某些部分所以它是一个真正的不完整类型.