首页 > 解决方案 > 实例化非静态内部类

问题描述

大家好,我正在尝试实例化一个名为 AdminHR 的内部类,外部类是抽象的 Administrator。

使用这种语法,Administrator.AdminHR OBj =OBj.new AdminHR();

但它说 OBj 尚未初始化。有没有人有什么建议?

标签: java

解决方案


内部类可以标记static。如果是,那么一切都是正常的(事实上,static除非你真的知道自己在做什么并且深思熟虑,否则你应该始终创建所有内部类)。如果他们不是,并且在您的情况下,AdminHR 不是,那么:

  1. 这个类默默地拥有外部的所有泛型,但有点狡猾/不可见,并且以一种非常烦人的方式。真的,您可能应该将事物重写为静态以避免不可避免的混乱,并且...

  2. 有一个不可见的字段,属于您的外部类的类型,即final. 构造函数有一个外部类类型的不可见参数,用于设置该字段。OuterClass.this您可以通过表达式: ,从内部类中引用此字段。编译器将在任何实例方法调用或对外部类的字段访问之前静默插入它。

当您new InnerClass()在外部类内部调用“实例上下文”时(例如,外部类中的非静态方法),然后this为该不可见的第一个参数以不可见的方式传递。到目前为止,一切都很好。

当您不在这样的上下文中时,您实际上需要一个外部实例来传递该不可见参数以设置不可见字段。它的语法非常时髦,它的:instanceOfOuter.new NonStaticInnerType().

您正在代码片段中尝试此操作,但是,正如编译器正确报告的那样,OBj 未初始化。事实上,OBj 甚至不是正确的类型(它应该是 Administator,而不是 AdminHR)。

解决方案是:

Administrator admin = new Administator();
Administrator.AdminHR hr = admin.new AdminHR();

或者,如果您已经在 Administator 类中的非静态方法中,只需:

Administrator.AdminHR hr = new AdminHR();

或者更有可能,忘记非静态内部类,那是一些火箭科学异国情调的java。通过将 AdminHR 本身设为静态来解决问题。如果您仍然需要从 Administator 引用实例内容,请明确显示该不可见字段,例如:

public class Administator {
    public static class AdminHR {
        private final Administrator admin;

        public AdminHR(Administrator admin) {
            this.admin = admin;
        }
    }
}

推荐阅读