This question already has an answer here:
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());
}
}
we cannot instantiate an abstract class then why is the function Two two(String s) able to create an instance of abstract class Two ????
It does not create an instance of abstract Two
. It creates a concrete, anonymous class that extends Two
and instantiates it.
It's almost equivalent to using a named inner class like this:
class One {
public Two two(String s) {
return new MyTwo();
}
class MyTwo extends Two {
public int display() {
System.out.println("display()");
return 1;
}
}
}
Because it implements the missing function display(). It returns an anonymous subclass of Two. You can see this if you look at the compiled files. You will have a One$1.class there, which extends Two.class!
来源:https://stackoverflow.com/questions/5154533/abstract-class-and-anonymous-class