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

Sea*_*ene 0 java instantiation abstract

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

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我创建一个抽象类abstractClass并在abstractClassTest()函数中返回它.它编译成功没有错误!IMO在返回之前,计算机应该创建该类型的对象.在这里它应该在返回m.function()之前创建一个abstractClass对象,这是我无法理解的.我认为我们不能实例化一个抽象类意味着我们不能创建一个抽象类的对象,或者我们不能创建一个类(例如).但是从上面的代码中,我们似乎可以创建一个抽象类的对象.它怎么能实现?对于代码,计算机在看到代码时会做什么?我们不能说java已经实例化了代码的抽象类?如果java不实例化该类,它如何返回代码中的对象?abstractClass m = new abstractClass() is illegalabstractClass mmabstractClass mabstractClassabstractClassabstract abstractClass a_function();

Jon*_*eet 5

是的,它应该编译没有错误.NullPointerException如果你曾经调用过abstractClassTest,它会抛出一个执行,因为你永远不会初始化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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,代码中没有任何内容可以创建抽象类的实例.仅仅因为你有一个这种类型的变量并不意味着已经创建了那种类型的对象.

  • @SpencerKormos:是的,OP似乎已经知道了. (3认同)