我正在摆弄java,我创建了两个类Outer
和Inner
public class Outer {
public class Inner {
}
}
内部类正在使用默认构造函数。我可以通过调用非args默认构造函数Inner
在Outer
内创建new Inner()
类的新实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要Outer
类型对象。
这是否意味着内部类默认构造函数不是非args?为什么以正常方式调用构造函数和反射之间存在不相交?
答案 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
上的方法,就好像它们是自己的一样。