我在摆弄 java,我创建了两个类,Outer
和 Inner
public class Outer {
public class Inner {
}
}
内部类使用默认构造函数。我可以通过调用非参数默认构造函数 new Inner()
在 Outer
中创建 Inner
类的新实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要 Outer
类型的对象。
这是否意味着内部类默认构造函数不是非参数?为什么正常调用构造函数和反射不相交?
最佳答案
“以正常方式调用构造函数和反射之间没有不相交”,只有从 Outer
类内部调用构造函数和从 Outer
类外部调用构造函数之间存在差异。
因为 Inner
类不是static
,所以它有一个对 Outer
的引用。如果你想从 Outer
的外部创建一个 Inner
的实例,你必须这样写:
Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
向Inner
的构造函数提供outerObj
的要求与通过反射实例化Inner
类时完全相同。唯一的区别是语法将 outerObj
放在运算符 new
的左侧,而反射将 outerObj
传递给构造函数。 Java 编译器向它自动生成的构造函数添加一个隐藏参数,其方式与它向生成的类添加一个隐藏字段以保存对 Outer
对象的引用的方式相同。
请注意,这仅适用于非静态内部类。当您的内部类是 static
时,没有隐藏参数和隐藏字段,因此反射允许您创建内部类的实例而无需 Outer
对象。
关于java - 内部类的默认构造函数是否需要外部类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33167281/