抽象类的实例

Kif*_*sif 9 java

你能澄清一下为什么这样有效:

public abstract class AbstractClassCreationTest {

    public void hello(){
        System.out.println("I'm the abstract class' instance!");
    }

    public static void main(String[] args) {
        AbstractClassCreationTest acct = new AbstractClassCreationTest(){};
        acct.hello();
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这与我们可以找到的规范相矛盾:

如果尝试使用类实例创建表达式(第15.9节)创建抽象类的实例,则这是编译时错误.

S.D*_*.D. 21

您可能没有注意到差异:

new AbstractClassCreationTest(){};
Run Code Online (Sandbox Code Playgroud)

new AbstractClassCreationTest();
Run Code Online (Sandbox Code Playgroud)

额外的{}是扩展抽象类的新的无名类的主体.您已创建匿名类的实例,而不是抽象类的实例.

现在继续在抽象类中声明一个抽象方法,观察编译器如何强制您在{}匿名类中实现它.


roc*_*boy 7

请注意以下区别:

 AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1

 NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2
Run Code Online (Sandbox Code Playgroud)

case1是一个匿名类定义.你没有实例化一个抽象类; 而不是你实例化一个子类型表示抽象类.


Joe*_*ras 0

抽象类无法实例化。

您必须创建一个扩展类来扩展抽象类,并实例化这个新类。

public abstract class AbstractClassCreationTest {

    public void hello(){
        System.out.println("I'm the abstract class' instance!");
    }
}

public class MyExtClass extends AbstractClassCreationTest() {
}

public static void main(String[] args) {
    MyExtClass acct = new MyExtClass(){};
    acct.hello();
}
Run Code Online (Sandbox Code Playgroud)

我发布这个。可以对你有用。祝你今天过得愉快