首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建抽象类的对象!=实例化抽象类?

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

Stack Overflow用户
提问于 2012-01-27 15:57:22
回答 3查看 4.9K关注 0票数 0

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

代码语言:javascript
复制
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()函数中返回它。并且编译成功,没有错误!在返回某物之前,计算机应创建该类型的对象。在这里,它应该在返回m.function()之前创建一个abstractClass对象,这一点我无法理解。我认为不能实例化抽象类abstractClass m = new abstractClass() is illegal__).意味着不能创建抽象类的对象,或者不能新建类(例如)但是从上面的代码来看,我们似乎可以创建一个抽象类的对象。它怎么能实现呢?对于代码abstractClass m,当计算机看到代码时,它会做什么?我们不能说java已经实例化了代码abstractClass m的抽象类m。如果java不实例化类abstractClass,它如何在代码abstract abstractClass a_function();中返回abstractClass的对象?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-27 16:00:16

是的,它应该没有错误的编译。但是,如果您曾经调用过NullPointerException,那么它将在执行时抛出一个abstractClassTest,因为您从未初始化m变量来引用实际实例。为了做到这一点,您必须创建一个具体的类,该类将对抽象类进行子类。

例如:

代码语言:javascript
复制
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();
    }
}

注意,代码中没有创建抽象类的实例。仅仅因为有了该类型的变量,并不意味着已经创建了该类型的对象。

票数 5
EN

Stack Overflow用户

发布于 2012-01-27 16:02:05

M永远不会被分配,您也不会尝试用新关键字实例化一个新的abstractClass。如果您的代码真的到达了abstractClassTest,那么您只会得到一个空指针异常。我认为你可能混淆了声明一个变量并给它一个值。

票数 1
EN

Stack Overflow用户

发布于 2012-01-27 16:01:19

您不能直接实例化抽象类,代码实际上也不能实例化抽象类。您所拥有的只是对抽象类中某个子类或其他类的引用,当您实例化'm‘时,您必须提供一个实际的具体子类。

对于接口,您可以得到类似的模式。写是很合法的,例如:

代码语言:javascript
复制
List m;
...
m.size();

但是,当您开始实例化时,您需要使用一个实现子类来实现,例如:

代码语言:javascript
复制
List m;
...
m = new ArrayList();
...
m.size();

注意,在实例化时,我们使用的是ArrayList,而不是List (这只是接口)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9036196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档