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

Does default constructor for inner class need an object of an outer class?

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

public class Outer {
    public class Inner { 
    }
}

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

这是否意味着内部 class 默认构造函数不是非参数?为什么正常调用构造函数和反射不相交?

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

没有"disjoint between calling constructor in normal way and reflection",只有在从Outerclass内部调用构造函数和从Outerclass外部调用构造函数之间。

由于 Inner class 不是 static,它引用了 Outer。如果要从 Outer 外部创建 Inner 的实例,则必须这样写:

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

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

请注意,这仅适用于非静态内部 classes。当你的内部 class 是 static 时,没有隐藏参数,也没有隐藏字段,所以反射允许你创建内部 class 的实例,而不需要 Outer 对象。

I can create new instance of Inner class inside Outer just by calling non-args default constructor new Inner()

内部是的,但他不会在外部或 Outer:

的静态方法之外编译
new Outer.Inner();

这是因为当您在 Outer 中调用 new Inner() 时,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 上的方法,就好像它们是它自己的方法一样。