实例化非静态内部类

时间:2019-01-14 18:21:15

标签: java

大家好,我试图实例化一个称为AdminHR的内部类,外部类为抽象的Administrator。

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

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

2 个答案:

答案 0 :(得分:0)

内部类可以标记为static。如果是这样,则一切正常(实际上,除非您真的知道自己在做什么并且已将其彻底考虑,否则您应该始终使所有内部类static成为可能)。如果不是这样,而您的情况是AdminHR,那就不是这样:

  1. 此类无声地包含了外部的所有泛型,但有点狡猾/无形,而且非常令人讨厌。确实,您应该将事物重写为静态,以避免不可避免的混乱,并且...

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

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

当您不在这种情况下时,实际上需要传递一个external实例,以使该不可见参数设置不可见字段。语法非常时髦,instanceOfOuter.new NonStaticInnerType()

您正在您的代码段中尝试此操作,但是,正如编译器正确报告的那样,未初始化OBj。实际上,OBj甚至不是正确的类型(它应该是管理员,而不是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;
        }
    }
}

答案 1 :(得分:-1)

根据您的问题,我认为class AdminHR是私有的。授予内部(和外部)类的访问级别取决于您。好吧,考虑到AdminHR是私有的,您将需要一种类似于 Singleton设计模式的方法。

您可以了解有关单一设计模式 here的更多信息。

abstract class Administrator{
  public AdminHR getAdminHRInstance(){
    return new AdminHR();
  }

  private class AdminHR{
    private Admin(){
     //Constructor implementation
    }
  }
}

但是,如果Administrator类是abstract,而AdminHRprivate,那么有人如何实例化AdminHR对象呢? >

首先,让我们谈谈抽象类。如果它是抽象的,则意味着它不能使用new关键字实例化。在这种情况下,我们将内部类和getAdminHRInstance()方法都声明为static

因此,如果上述对象是static,我们可以创建一个这样的实例:

AdminHR adminHRObject = Administrator.getAdminHRInstance();

因为我们需要它们是非静态,所以唯一的解决方案是将Administrator抽象类扩展到其他某个类。这将使Administrator成为子类的父类,这意味着子类(我们将其称为SomeOtherClass)将继承其父类的方法和变量。

但是,AdminHR仍然是private

如何?其他一些类是否会知道我们要实例化的对象的 type ? (在这种情况下,类型为AdminHR )。这是 INTERFACES 发挥作用的地方。

我们定义了一个接口AdminHRInterface:

public interface AdminHRInterface{
//does not need to have an implementation
}

然后我们有AdminHR实现该接口:

abstract class Administrator{
  public AdminHR getAdminHRInstance(){
    return new AdminHR();
  }

  private class AdminHR implements AdminHRInterface{
    private Admin(){
     //Constructor implementation
    }
  }
}

然后您可以像这样实例化AdminHR对象:

public class SomeOtherClass extends Administrator{
  /*SomeOtherClass has inherited all methods, variables
   and even inner classes from Administrator*/
  public AdminHRInterface adminHRObject = admin.getAdminHRInstance();
}

在上面的代码段中,admin.getAdminHRInstance()方法将返回类型为AdminHR的对象。但是我们不知道,因为该类是私有的。因为它实现了一个公共接口(我们可以看到并可以访问它),所以可以说返回类型为AdminHRInterface类型。

瞧!