JVM如何管理Java接口?

时间:2015-03-06 09:30:27

标签: java

假设有一个没有任何方法或属性的基类,如下面的class Base

public abstract class Base {
    public Base() {}
}

我们还有另一个来自class Base的类,比如说class Concrete。据我所知,当我们创建Concrete类的实例时,会创建两个实例:第一个是class Base,第二个是class Concrete。请考虑以下代码,创建200个实例。

for(int i = 0; i < 100; i++)
    Concrete c = new Concrete(); 

对于上述情况,使class Base成为一个接口是否有意义?如果我们这样做,将创建多少个实例,100或200?换句话说,是所有类实例共有的接口,还是每个类实例都有自己的接口实例?

2 个答案:

答案 0 :(得分:4)

如果为派生类创建实例,则不会为抽象类创建单独的实例。只调用默认构造函数来初始化类(这意味着它将为字段分配默认值)。

如果您在同一个对象上检查instanceof运算符,则会得到真实的响应。

如果您的抽象类有两个不同的子类,当您实例化它们时,将调用它们的构造函数,然后将调用父构造函数并初始化字段。

如果您不做任何事情,将调用父项的默认构造函数。但是,您可以使用super关键字来调用父类的特定构造函数。

答案 1 :(得分:3)

由于您的抽象基类没有任何功能,因此它作为接口会更有用。

在任何一种情况下,只创建了100个实例(类Concrete)。这些实例恰好也是Base的实例。