问题的简短形式是:
充实问题:
假设我有一个抽象类:
public abstract class Abstract1 {}
然后我有第二个可以创建Abstract1实例的抽象类:
public abstract class Abstract2 {
protected Abstract1 createAbstract1() {
return new Abstract1() {};
}
}
第三,我有一个具体的Abstract2实现:
public class Concrete extends Abstract2 {}
让我们将一些打印语句放入Abstract2:
public abstract class Abstract2 {
public Abstract1 createAbstract1() {
System.out.println("I am: " + getClass().getName());
Abstract1 a1 = new Abstract1() {};
System.out.println("A1 is enclosed by: " + ab1.getClass().getEnclosingClass().getName());
return a1;
}
}
当我们构建Concrete
并要求A1如下...
Concrete charlie = new Concrete();
Abstract1 myA1 = charlie.createAbstract1();
...我们看到以下输出:
I am: Concrete
A1 is enclosed by: Abstract2
myA1怎么知道它是由Concrete而不是Abstract2创建的?
答案 0 :(得分:0)
是的,你可以。见例:
public class App
{
public static void main(String[] args)
{
Concrete charlie = new Concrete();
Abstract1 myA1 = charlie.createAbstract1();
myA1.printOuter();
}
}
abstract class Abstract1
{
abstract void printOuter();
}
abstract class Abstract2
{
public Abstract1 createAbstract1()
{
System.out.println("I am: " + getClass().getName());
Abstract1 a1 = new Abstract1()
{
@Override
void printOuter()
{
//We can access instance of outer class by "Abstract2.this"
System.out.println("My outer class: " + Abstract2.this.getClass().getName());
}
};
System.out.println("A1 is enclosed by: " + a1.getClass().getEnclosingClass().getName());
System.out.println("Real class of this: " + getClass().getName());
return a1;
}
}
class Concrete extends Abstract2
{
}
如果你真的想从内部类中获取它,而不是创建它的方法,我添加了printOuter
方法。