我在尝试Java编程时,创建了两个类,Outer
和Inner
。
public class Outer {
public class Inner {
}
}
内部类使用默认构造函数。在Outer
内部调用非参数默认构造函数new Inner()
就可以创建一个新的Inner
类实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要Outer
类型的对象。
这是否意味着内部类的默认构造函数不是非参数的?为什么在正常调用构造函数和反射中存在差异?
我在尝试Java编程时,创建了两个类,Outer
和Inner
。
public class Outer {
public class Inner {
}
}
内部类使用默认构造函数。在Outer
内部调用非参数默认构造函数new Inner()
就可以创建一个新的Inner
类实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要Outer
类型的对象。
这是否意味着内部类的默认构造函数不是非参数的?为什么在正常调用构造函数和反射中存在差异?
在正常方式和反射方式下调用构造函数并没有“不连续的”,只有在从Outer
类内部和Outer
类外部调用构造函数之间才存在不连续。
由于Inner
类不是static
,它引用了Outer
。如果你想要在Outer
外部创建一个Inner
实例,你必须像这样写:
Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
outerObj
给Inner
构造函数的要求与通过反射实例化Inner
类时完全相同。唯一的区别是语法将outerObj
放在new
操作符左侧,而反射将outerObj
传递给构造函数。Java编译器会自动生成一个隐藏参数添加到构造函数中,以相同的方式生成一个隐藏字段来保存对Outer
对象的引用。static
时,没有隐藏参数和隐藏字段,因此反射允许您创建内部类的实例而不需要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
的方法,就像它是自己的一样。