java - 内部类的默认构造函数是否需要外部类的对象?

标签 java reflection

我在摆弄 java,我创建了两个类,OuterInner

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/

相关文章:

java - 使用连接池进行 Spring Boot 和数据库测试

java - 使用反射的通用类类型父级

java - 不使用反射实例化类对象

c# - 通过匹配其属性来填充类

c# - 如何更新 EF ObjectContext 中通用实体的属性?

java - 如何删除 NetBeans 中自动生成的注释? (//NOI18N)

java - 使用 volley.jar 将图像从服务器加载到我的应用程序

java - 使用反射时如何检查字段是否有注释

java - 使用反射使用父类(super class)获取子类字段?

java - 选择行之前在 JTable 中执行操作