我们可以在Java中制作抽象类的实例吗

时间:2019-10-15 19:04:49

标签: java

抱歉,我们知道事实 在Java中,您无法创建抽象类的实例,因为它没有完整的实现。抽象类的目的是充当子类的基础。 那么关于java中的NumberFormat类是抽象的权利??

问题是这段代码如何:

NumberFormat numberFormatter = NumberFormat.getNumberInstance();
  1. 这是什么意思?如果我没有记错,这意味着我们使用numberFormatter制作了NumberFormat的对象实例?还是什么?
  2. NumberFormater是抽象的吗?所以我们需要对其做一个子类。
  3. 如果我问的第一个问题是错误的事实,那么为什么我们在此代码行上使用numberFormatter.format(x); String numberStr = numberFormatter.format(x);

完整的代码显示在下面,非常感谢您的答复。

public class NumberFormatToy {   
    public static void main(String args[]) {      
        double x = 1000.0/3.0;      
        NumberFormat numberFormatter = NumberFormat.getNumberInstance();      
        NumberFormat currFormatter = NumberFormat.getCurrencyInstance();      
        NumberFormat percentFormatter = NumberFormat.getPercentInstance();      

        String numberStr = numberFormatter.format(x);      
        String currStr = currFormatter.format(x);       
        String percentStr = percentFormatter.format(x);      

        System.out.println("double 1000.0/3.0 berformat number   : "+ numberStr);      
        System.out.println("double 1000.0/3.0 berformat currency : "+ currStr);      
        System.out.println("double 1000.0/3.0 berformat percent  : "+ percentStr);   
    }
}

3 个答案:

答案 0 :(得分:3)

您已经了解,由于NumberFormat是抽象的,因此无法做到这一点:

new NumberFormat();

但是,创建的实际对象可能(并且经常)与引用该对象的变量类型不同。在您的一个示例中-NumberFormat numberFormatter = NumberFormat.getNumberInstance();NumberFormat.getNumberInstance()返回的对象是扩展NumberFormat的对象。

此行代码打印出NumberFormat.getNumberInstance()返回的对象的类:

System.out.println(NumberFormat.getNumberInstance().getClass());

打印出来的

class java.text.DecimalFormat

如果您查看Javadoc for DecimalFormat,则会看到它扩展了NumberFormat

您还可以调用NumberFormat.getNumberInstance()并使用NumberFormat实现的接口之一存储结果(您可以看到in the Javadoc)。这是显示如何创建类型Serializable的变量的示例:

Serializable s = NumberFormat.getNumberInstance();

并且类似地,使用构造函数创建Serializable的实例也是无效的,因此不允许这样做:new Serializable()

答案 1 :(得分:1)

if (i % 2) setErrors(prevErros =>({ ...prevErros, email: test${i}}) 类确实是抽象的,但是静态方法不能是抽象的。

因此,您可以在抽象类中定义一个静态方法,该方法返回从抽象类继承的类的对象。

方法 var str = "a.b.c.d#.e.f.g.h#.i.j.k.l"; var res = str.split(/[.#]/); NumberFormatgetNumberInstance等都是静态方法,它们返回扩展了getCurrencyInstance的某个类的对象。

答案 2 :(得分:0)

如果您使用类似的代码-收藏夹列表= Collections.asList(“ a”,“ b”);这意味着您获得接口Collection的对象?原因是这仅意味着静态方法asList()返回实现Collection的内容。   因此,如果您看到这样的代码,请确保某个方法返回某个类的对象,并且如果您想知道哪个类,则只需按CTRL +单击此方法,您的IDE就会向您显示该代码,然后您将看到它返回什么。