内部 class 的默认构造函数是否需要外部 class 的对象?
Does default constructor for inner class need an object of an outer class?
我在摆弄 java,我创建了两个 classes,Outer
和 Inner
public class Outer {
public class Inner {
}
}
内部class正在使用默认构造函数。我可以通过调用非参数默认构造函数 new Inner()
在 Outer
中创建 Inner
class 的新实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要 Outer
类型的对象。
这是否意味着内部 class 默认构造函数不是非参数?为什么正常调用构造函数和反射不相交?
您的内部 class 不是静态的,因此只有当您拥有外部对象时才能创建内部实例。
没有"disjoint between calling constructor in normal way and reflection",只有在从Outer
class内部调用构造函数和从Outer
class外部调用构造函数之间。
由于 Inner
class 不是 static
,它引用了 Outer
。如果要从 Outer
外部创建 Inner
的实例,则必须这样写:
Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
要求向Inner
的构造函数提供outerObj
与通过反射实例化Inner
class完全一样。唯一的区别是语法将 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
上的方法,就好像它们是它自己的方法一样。
我在摆弄 java,我创建了两个 classes,Outer
和 Inner
public class Outer {
public class Inner {
}
}
内部class正在使用默认构造函数。我可以通过调用非参数默认构造函数 new Inner()
在 Outer
中创建 Inner
class 的新实例。但是当我尝试使用反射做同样的事情时,我注意到构造函数需要 Outer
类型的对象。
这是否意味着内部 class 默认构造函数不是非参数?为什么正常调用构造函数和反射不相交?
您的内部 class 不是静态的,因此只有当您拥有外部对象时才能创建内部实例。
没有"disjoint between calling constructor in normal way and reflection",只有在从Outer
class内部调用构造函数和从Outer
class外部调用构造函数之间。
由于 Inner
class 不是 static
,它引用了 Outer
。如果要从 Outer
外部创建 Inner
的实例,则必须这样写:
Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
要求向Inner
的构造函数提供outerObj
与通过反射实例化Inner
class完全一样。唯一的区别是语法将 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
上的方法,就好像它们是它自己的方法一样。