你能否澄清一下为什么会这样做:
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();
}
}
我认为这与我们可以找到的规范相矛盾:
如果尝试创建抽象实例,则是编译时错误 使用类实例创建表达式的类(第15.9节)。
答案 0 :(得分:21)
您可能没有注意到差异:
new AbstractClassCreationTest(){};
与
new AbstractClassCreationTest();
额外的{}
是扩展抽象类的新的无名类的主体。您已创建anonymous class的实例,而不是抽象类的实例。
现在继续在抽象类中声明一个抽象方法,观察编译器如何强制你在匿名类的{}
内实现它。
答案 1 :(得分:7)
注意:
之间的区别 AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1
NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2
case1 是anonymous class定义。你不实例化一个抽象类;相反,您正在实例化所述抽象类的 subType 。
答案 2 :(得分:3)
这里你没有创建AbstractClassCreationTest
类的对象,实际上你正在创建一个扩展AbstractClassCreationTest
类的匿名内部类的对象。这是因为你写了new AbstractClassCreationTest(){} not new AbstractClassCreationTest()
您可以从here
答案 3 :(得分: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();
}
我发布了this。对你有用。祝你有愉快的一天