2015-10-16 130 views
2

我摆弄周围用java,我创建了两个班,OuterInner内部类的默认构造函数是否需要外部类的对象?

public class Outer { 
    public class Inner { 
    } 
} 

内部类使用默认构造函数。只需调用非参数的默认构造函数new Inner(),我就可以在Outer内创建Inner类的新实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要Outer类型的对象。

这是否意味着内部类的默认构造函数不是非参数?为什么以正常方式调用构造函数与反射之间存在脱节?

回答

2

没有“调用正常的方式和反射构造之间的脱节”,只能从Outer类的内部和Outer类之外调用构造函数之间。

由于Inner类不是static,因此它对Outer的引用。如果你想从Outer之外创建的Inner一个实例,你必须把它写这样的:

Outer outerObj = new Outer(); 
Outer.Inner innerObj = outerObj.new Inner(); 

要求提供outerObjInner构造是完全一样的,当你实例Inner类通过如反射。唯一的区别是语法将outerObj放置在运算符new的左侧,而反射通过outerObj传递给构造函数。 Java编译器为它自动生成的构造函数添加一个隐藏参数,就像它向生成的类添加一个隐藏字段以保存对对象的引用一样。

请注意,这仅适用于非静态内部类。当你的内部类是static时,没有隐藏的参数,也没有隐藏的字段,所以反射可以让你在没有Outer对象的情况下创建内部类的实例。

1

您的内部类不是静态的,所以只有拥有外部对象时才可以创建内部实例。

1

我可以通过调用非ARGS默认构造函数的新内()

里面是的,但他不会编译外外或从静态里面创建:外新的类实例的Outer方法:

new Outer.Inner(); 

这是因为,当你调用new Inner()Outerthis被隐式地传递给构造,使得这样的:

public class Outer { 
    public class Inner { 
    } 

    public example(){ 
     new Inner(); 
    } 
} 

等效于此静态版本:

public class Outer { 
    public static class Inner { 
     private Outer mOuter; 
     public Inner(Outer outer){ 
      mOuter = outer; 
     } 
    } 

    public example(){ 
     new Inner(this); 
    } 
} 

隐藏参考Outer允许内部到,尽管它们是它自己的调用上Outer方法。

相关问题