可以实例化抽象类吗?

时间:2015-09-02 06:09:40

标签: 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();
    }
} 

我知道抽象类无法实例化,但对此代码感到困惑。 实际上这段代码是什么意思?

2 个答案:

答案 0 :(得分: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"
    } 
} 

答案 1 :(得分:14)

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