【问题标题】:How to instantiate an abstract class in Java?如何在 Java 中实例化一个抽象类?
【发布时间】:2015-06-20 18:05:57
【问题描述】:

我有一个名为 EmployeeFileProcessor 的公共抽象类,这也是我要实例化的。我将如何轻松修复此代码以便我可以实例化它?

public abstract class EmployeeFileProcessor
{
    public static void main(String[] args) throws Exception
    {   
        EmployeeFileProcessor process = new EmployeeFileProcessor();
        //Non important code here
        process.writeFullTimeEmployee(user_input1, FtCollection[0]);
        //Defined in another class (method writeFullTimeEmployee)
        process.readFulltimeEmployee(user_input1);
        //Defined in another class (method readFullTimeEmployee)
    }
}

我将如何使用“流程”?

【问题讨论】:

  • 你不能实例化抽象类。时期。这就是java的工作原理。如果您的设计需要实例化抽象类,那么您需要更改您的设计
  • 最大的问题是:为什么你首先希望这个类是抽象的?也许您对“抽象”的含义有一个错误的概念。

标签: java instantiation abstract


【解决方案1】:

您不能直接创建抽象类的实例。您必须首先定义一个扩展抽象类的类,然后创建该类的实例。

例如

public ConcreteEmployeeFileProcessor extends EmployeeFileProcessor {

}

然后您可以创建 ConcreteEmployeeFileProcessor 的实例,但使用抽象类型引用它。

EmployeeFileProcessor instance = new ConcreteEmployeeFileProcessor();

【讨论】:

    【解决方案2】:

    您不能实例化 abstract 类。你有三个选择:

    1. 通过从类声明中删除 abstractEmployeeFileProcessor 更改为非抽象类。
    2. 改为实例化您的类的匿名内部子类:EmployeeFileProcessor process = new EmployeeFileProcessor() { };(不推荐)
    3. EmployeeFileProcessor中的所有方法和字段更改为static。这样,您不再需要实例化EmployeeFileProcessor。 (除非你的班级没有状态,否则不推荐)

    换句话说,如果您想实例化它,请不要创建abstract 类。

    【讨论】:

    • 将抽象类更改为非抽象类不是实例化抽象类的方法。获取对抽象类实例的引用的唯一方法是扩展它,然后获取扩展它的类的实例。
    • 投反对票的人能否发表评论,让我知道我的回答有什么问题?正如我所看到的,我已经回答了这个问题。
    • 我对你的答案投了反对票,因为 2、3 和 4 是你自己说的“不推荐”,并且第 1 点没有给你一个抽象类的实例。
    【解决方案3】:

    抽象类是根据定义不能实例化的类。它类似于接口,除了能够声明字段并实际实现函数以防它们未被覆盖(对于 Java 8,您可以在接口中使用默认方法)

    无论如何,如果你真的想以默认方式实例化这个类,你可以尝试这样做:

    EmployeeFileProcessor process = new EmployeeFileProcessor() {};
    

    但这很可能是一个非常糟糕的设计;-)

    【讨论】:

    • 它类似于接口,除了能够声明字段并在不被覆盖的情况下实际实现功能。不对。接口也可以有具体的方法。
    • 是的。该问题已被标记为 java,因此如果您的答案基于它,最好提及特定版本的 Java。
    • 好的,为了更具体,更改了答案。但是(这只是我的观点)我看不到在接口中实现方法的巨大优势。
    • 您有权发表自己的意见。请阅读this 答案。
    • 谢谢,关于单继承问题非常正确;-)
    猜你喜欢
    • 2014-09-08
    • 2019-08-26
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多