访谈:我们可以实例化抽象类吗?

问题:

面试官问 – 我们可以实例化一个抽象类吗?我说,不,他告诉我 – 错了,我们可以。
我争辩了一下。然后他告诉我,你自己在家里试试。

abstract class my {
    public void mymethod() {
        System.out.print("Abstract");
    }
}

class poly {
    public static void main(String a[]) {
        my m = new my() {};
        m.mymethod();
    }
}

在这里,我创建了我的类的实例和调用抽象类的方法。有人可以请我解释一下吗我在采访中真的错了吗?

回答:

在这里,我正在创建我的课程的实例

不,你不是在这里创建你的抽象类的实例。相反,您正在创建一个您抽象类的anonymous subclass的实例。然后您正在调用abstract class参考指向subclass object的方法
这种行为在JLS – Section # 15.9.1中清楚列出:

如果类实例创建表达式以类体的形式结束,那么被实例化的类是一个匿名类。然后:

强调我的
此外,在JLS – Section # 12.5中,您可以阅读Object Creation Process。我会在这里引用一个声明:

每当创建一个新的类实例时,为它分配内存空间,其中包含在类类型中声明的所有实例变量的空间,以及在类类型的每个超类中声明的所有实例变量,包括可能隐藏的所有实例变量。
在返回对新创建的对象的引用之前,将使用以下过程处理指定的构造函数以初始化新对象:

您可以在我提供的链接上阅读完整的过程。
要实际看到被实例化的类是Anonymous SubClass,你只需要编译你的类。假设你把这些类放在两个不同的文件中:
 My.java:

abstract class My {
    public void myMethod() {
        System.out.print("Abstract");
    }
}

 Poly.java:

class Poly extends My {
    public static void main(String a[]) {
        My m = new My() {};
        m.myMethod();
    }
}

现在,编译你的源文件:

javac My.java Poly.java

现在在您编译源代码的目录中,您将看到以下类文件:

My.class
Poly$1.class  // Class file corresponding to anonymous subclass
Poly.class

看到这个类 – Poly$1.class。它是由编译器创建的类文件对应于您使用以下代码实例化的匿名子类:

new My() {};

所以,很明显有不同的类被实例化。只是在编译器编译后,该类才被赋予一个名称。
通常,类中的所有匿名子类将以此方式命名:

Poly$1.class, Poly$2.class, Poly$3.class, ... so on

这些数字表示这些匿名类在封闭类中出现的顺序。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Interview: Can we instantiate abstract class?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

8 + 2 =