关于java:可以实例化一个抽象类吗?

Can an abstract class be instantiated?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
abstract class A {
    public void disp() {
        System.out.print("Abstract");
    }
}

public class B {
    public static void main(String args[]) {
        A object = new A(){ };
        object.disp();
    }
}

我知道抽象类不能被实例化,但是在这段代码中很困惑。实际上,这段代码是什么意思?


这里的微妙之处在""中。它意味着您显式地为抽象类A的缺失部分(缺失部分是抽象方法)提供匿名实现,允许您实例化它。

但是在A中没有抽象方法,因此匿名实现是空的。

使用至少一个抽象方法显示行为的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class A {
    public abstract void bar();
    public void disp() { System.out.print("Abstract"); }
}

public class B {
    public static void main(String args[]) {
        A object = new A() {
            @Override public void bar() { System.out.print("bar"); }
        };
        object.disp(); //prints"Abstract"
        object.bar(); //prints"bar"
    }
}


这称为匿名内部类。您不是在实例化抽象类,而是在实例化扩展抽象类的具体匿名内部类。当然,为了允许这样做,匿名内部类必须为抽象超类的所有抽象成员提供实现…在本例中是这样做的,因为抽象超类没有抽象成员。