你能澄清一下为什么这样有效:
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)
额外的{}是扩展抽象类的新的无名类的主体.您已创建匿名类的实例,而不是抽象类的实例.
现在继续在抽象类中声明一个抽象方法,观察编译器如何强制您在{}匿名类中实现它.
请注意以下区别:
AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1
NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2
Run Code Online (Sandbox Code Playgroud)
case1是一个匿名类定义.你没有实例化一个抽象类; 而不是你实例化一个子类型表示抽象类.
抽象类无法实例化。
您必须创建一个扩展类来扩展抽象类,并实例化这个新类。
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)
我发布这个。可以对你有用。祝你今天过得愉快
| 归档时间: |
|
| 查看次数: |
9822 次 |
| 最近记录: |