[英]Does default constructor for inner class need an object of an outer class?
我在摆弄Java,并创建了两个类, Outer
类和Inner
类
public class Outer {
public class Inner {
}
}
内部类正在使用默认构造函数。 我可以通过调用非参数默认构造函数new Inner()
在Outer
创建Inner
类的新实例。 但是当我尝试使用反射来做同样的事情时,我注意到构造函数需要Outer
类型对象。
这是否意味着内部类默认构造函数不是non-args? 为什么正常调用构造函数和反射之间不相交?
在“以正常方式调用构造函数和反射之间没有脱节”,只有在从Outer
类内部和从Outer
类外部调用构造函数之间没有。
由于Inner
类不是static
,因此它具有对Outer
的引用。 如果要从Outer
外部创建Inner
实例,则必须这样编写:
Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
提供要求outerObj
到的构造函数Inner
是完全一样的,当你实例化的Inner
通过反射类。 唯一的区别是语法在操作符new
的左侧放置了outerObj
,而反射将outerObj
传递给了构造函数。 Java编译器向其自动生成的构造函数中添加了一个隐藏参数,其方式与向已生成的类中添加隐藏字段以保持对Outer
对象的引用相同。
请注意,这仅适用于非静态内部类。 当内部类为static
,没有隐藏的参数,也没有隐藏的字段,因此反射使您可以创建内部类的实例而无需使用Outer
对象。
内部类不是静态的,因此只有在拥有外部对象时才能创建内部实例。
我可以在外部内部创建新的内部类实例,只需调用非参数默认构造函数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
方法,就好像它们是自己的一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.