内部类的默认构造函数是否需要外部类的对象?

时间:2015-10-16 09:45:15

标签: java reflection

我正在摆弄java,我创建了两个类OuterInner

public class Outer {
    public class Inner { 
    }
}

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

这是否意味着内部类默认构造函数不是非args?为什么以正常方式调用构造函数和反射之间存在不相交?

3 个答案:

答案 0 :(得分:2)

在正常方式调用构造函数和反射"之间没有"不相交,只是在Outer类内部和Outer类外部调用构造函数之间。

由于Inner课程不是static,因此它引用了Outer。如果要从Inner之外创建Outer的实例,则必须按以下方式编写:

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

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

请注意,这仅适用于非静态内部类。当您的内部类为static时,没有隐藏参数且没有隐藏字段,因此反射允许您在没有Outer对象的情况下创建内部类的实例。

答案 1 :(得分:1)

您的内部类不是静态的,因此只有拥有外部对象时才能创建内部实例。

答案 2 :(得分:1)

  

我可以通过调用非args默认构造函数new Inner()

在Outer中创建Inner类的新实例

在yes中,但是他不会在Outer之外编译或从Outer的静态方法编译:

new Outer.Inner();

这是因为当您在new Inner() Outer内调用this时,会隐式传递给构造函数,以便:

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上的方法,就好像它们是自己的一样。