繁体   English   中英

创建抽象类的对象!=实例化抽象类?

[英]create an object of an abstract class != instantiate the abstract class?

我了解到我们无法实例化一个抽象类。 但是今天我测试了一些代码,对此感到困惑。

package MainPackage;

abstract class abstractClass {
    abstract abstractClass a_function();
}

public class Src {
    abstractClass m;
    public abstractClass abstractClassTest() {
        return m.a_function();
    }
    public static void main(String args[]) {
        System.out.println("Hello world!");
    }
}

在这里,我创建一个抽象类abstractClass ,并在abstractClassTest()函数中返回它。 并且编译成功,没有错误! IMO在返回某些内容之前,计算机应创建该类型的对象。 在这里,它应该在返回m.function()之前创建一个abstractClass对象,我无法理解。 我认为我们不能实例化一个抽象类意味着我们不能创建一个抽象类的对象或我们不能创建一个 新的类(例如abstractClass m = new abstractClass() is illegal 但是从上面的代码看来,我们可以创建一个抽象类的对象。 如何实现? 对于代码abstractClass m ,什么是电脑做的,当它看到的代码?我们不能说Java有实例化的抽象类m的代码abstractClass m 并且如果java不实例化class abstractClass类,则如何在代码abstract abstractClass a_function();返回abstractClass的对象abstract abstractClass a_function();

是的,它应该编译没有错误。 但是,如果您曾经调用abstractClassTest ,则会在执行时引发NullPointerException ,因为您从未初始化m变量以引用实际实例。 为此,您必须创建一个具体类,该类将抽象类抽象化。

例如:

public class ConcreteClass extends AbstractClass {
    @Override AbstractClass a_function() {
       return this;
    }
}

public class Src {
    private AbstractClass m = new ConcreteClass();

    public AbstractClass abstractClassTest() {
        return m.a_function();
    }
    public static void main(String args[]) {
        new Src().abstractClassTest();
    }
}

请注意,您的代码中没有任何内容可以创建抽象类的实例。 仅仅因为您拥有该类型的变量并不意味着已经创建了该类型的对象

永远不会分配m,也永远不会尝试使用new关键字实例化一个新的abstractClass。 如果您的代码实际上必须抽象到AbstractClassTest,则只会得到一个空指针异常。 我认为您可能会混淆声明变量并实际给它赋值。

您不能直接实例化一个抽象类,而您的代码实际上并未这样做。 您所拥有的仅仅是对某些子类或抽象类中其他子类的引用,而当您实例化“ m”时,您将必须提供一个实际的具体子类。

您会在接口上得到类似的模式。 编写是相当合法的,例如:

List m;
...
m.size();

但是当您实例化实例时,您将使用一个实现子类来实现,例如:

List m;
...
m = new ArrayList();
...
m.size();

请注意,在实例化时,我们如何使用ArrayList而不是List(仅是接口)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM