问题
This question already has an answer here:
- Creating the instance of abstract class or anonymous class 8 answers
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 ????
回答1:
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;
}
}
}
回答2:
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