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

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

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

 NumberFormat nf = NumberFormat.getInstance(); 

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

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

谢谢。

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

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

 public static final NumberFormat getInstance() 

也是一个NumberFormat ,但它是它的子类的具体实例。

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

DecimalFormat的文档中,它指出:

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

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