可以实例化抽象类吗?

Nar*_*mal 16 java

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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

我知道抽象类无法实例化,但在此代码上混淆.实际上这段代码是什么意思?

Spo*_*ted 30

这里的微妙之处在于"{}".这意味着您明确地为抽象类的缺失部分(缺少的部分是抽象方法)提供匿名实现,A允许您实例化它.

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

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

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"
    } 
} 
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 14

这称为匿名内部类.您没有实例化抽象类,而是实例化扩展抽象类的具体匿名内部类.当然,为了允许这种情况,匿名内部类必须为抽象超类的所有抽象成员提供实现...在这种情况下它是这样做的,因为抽象超类没有抽象成员.