为了账号安全,请及时绑定邮箱和手机立即绑定

我们能实例化一个抽象类吗?

我们能实例化一个抽象类吗?

慕的地6264312 2019-07-09 16:15:09
我们能实例化一个抽象类吗?在我的一次面试中,有人问我“我们能否实例化一个抽象类?”我的回答是“不,我们不能”。但是,面试官告诉我“错了,我们可以。”我在这个问题上争论了一下。然后他让我自己在家试试。abstract class my {     public void mymethod() {         System.out.print("Abstract");     }}class poly {     public static void main(String a[]) {         my m = new my() {};         m.mymethod();     }}在这里,我创建类的实例并调用抽象类的方法。有人能给我解释一下吗?我面试的时候真的错了吗?
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

上面的实例是一个匿名内部类,它是my抽象类。它不完全等同于实例化抽象类本身。OTOH,每个子类实例都是其所有超类和接口的实例,因此大多数抽象类实际上都是通过实例化它们的一个具体子类来实例化的。

如果面试官说错了!没有解释,并给出了这个例子,作为一个独特的反例,我认为他不知道他在说什么,尽管。


查看完整回答
反对 回复 2019-07-09
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

只是你可以做的观察:

  1. 为什么

    poly

    延展

    my

    ?这没用.。
  2. 汇编的结果如何?三个档案:

    my.classpoly.class

    poly$1.class

  3. 如果我们能够实例化这样的抽象类,我们也可以实例化一个接口.奇怪.。


我们能实例化一个抽象类吗?

不,我们不能。我们可以做的是创建一个匿名类(这是第三个文件)并实例化它。


超类实例化怎么样?

不实例化抽象超类。我们不过是爪哇。

编辑:让他测试这个

public static final void main(final String[] args) {
    final my m1 = new my() {
    };
    final my m2 = new my() {
    };
    System.out.println(m1 == m2);

    System.out.println(m1.getClass().toString());
    System.out.println(m2.getClass().toString());}

产出如下:

falseclass my$1class my$2


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 406 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号