Instance of an abstract class
你能解释一下为什么这样做有效吗?
1 2 3 4 5 6 7 8 9 10 11
| 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)初始化。
您可能没有注意到区别:
1
| new AbstractClassCreationTest(){}; |
对战
1
| new AbstractClassCreationTest(); |
这个额外的{}是一个新的、没有名字的类的主体,它扩展了抽象类。您已经创建了一个匿名类的实例,而不是抽象类的实例。
现在继续在抽象类中声明一个抽象方法,观察编译器如何强制您在匿名类的{}中实现它。
注意以下两者之间的区别:
1 2 3
| AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1
NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2 |
case1是一个匿名类定义。您不是在实例化抽象类;而是在实例化所述抽象类的子类型。
- 但是,当我声明匿名类时,我不使用抽象类。我不知道是否可能。我在网上找不到任何东西,在你的链接中,抽象类和匿名类之间的链接没有引用。
这里你不是在创建AbstractClassCreationTest类的对象,实际上你是在创建一个匿名内部类的对象,扩展AbstractClassCreationTest类,这是因为你写了new AbstractClassCreationTest(){} not new AbstractClassCreationTest()类。你可以从这里了解更多关于匿名内部类的信息
无法实例化抽象类。
您必须创建一个扩展类来扩展抽象类,从而使这个新类独立。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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();
} |
我张贴这个。对你有用。祝你今天愉快