abstract class Two {
Two() {
System.out.println("Two()");
}
Two(String s) {
System.out.println("Two(String");
}
abstract int display();
}
class One {
public Two two(String s) {
return new Two() {
public int display() {
System.out.println("display()");
return 1;
}
};
}
}
class Ajay {
public static void main(String ...strings ){
One one=new One();
Two two=one.two("ajay");
System.out.println(two.display());
}
}
我们无法实例化一个抽象类,那么为什么函数两个二(String s)能够创建一个抽象类的实例两个 ????
答案 0 :(得分:10)
它不会创建抽象Two
的实例。它创建了一个具体的匿名类,扩展了Two
并实例化它。
这几乎等同于使用这样的命名内部类:
class One {
public Two two(String s) {
return new MyTwo();
}
class MyTwo extends Two {
public int display() {
System.out.println("display()");
return 1;
}
}
}
答案 1 :(得分:2)
因为它实现了缺失的函数display()。它返回一个匿名子类Two。如果查看编译后的文件,可以看到这个。你将有一个One $ 1.class,它扩展了Two.class!