public class ABC extends XYZ
{
          public static class InnerClass1
          {
            ...
          }
          public static class InnerClass2
          {
            ...
          }
          public static class InnerClass3
          {
            ...
          }
          public static class InnerClass4
          {
            ...
          }
}


在上面的代码中,我无法访问内部类1,2,3和4中的XYZ类的方法。如何修改上述结构,以便内部类可以访问XYZ类中的方法?

提前致谢 !

最佳答案

public class ABC extends XYZ
{
      public static class InnerClass1
      {
        ...
      }


InnerClass1不是内部类。由于单词static,它是一个嵌套类。

如果没有static,它将是一个内部类。并且该内部类的任何实例都具有对ABC(也是XYZ)的隐藏引用。如果内部类调用了ABCXYZ的任何实例方法,或引用了这些类中的任何实例变量,则它将使用该隐藏引用来调用实例方法或访问实例变量。

但是,由于它是一个嵌套类,因此没有对ABC(或XYZ)的隐藏引用。因此,如果您没有调用ABC对象,则调用实例方法或引用实例变量将无法执行。 (但是,您仍然可以调用ABC的静态方法,或引用静态变量。)

我不确定解决方案是什么-它取决于您的需求。您可能无法调用的XYZ方法实际上并不需要XYZ对象,因此这些方法应该是静态的。嵌套类也可能有一些用于访问实例方法的显式ABCXYZ变量。如果您有要处理的对象,您仍然可以从嵌套类中调用实例方法:

public static class NestedClass {
    XYZ x;
    void someMethod() {
       x.instanceMethod();  // legal even if instanceMethod is non-static
    }
}


另一种解决方案是删除单词static,以便InnerClass1确实具有对ABC的隐藏引用。这意味着在创建InnerClass1实例时,需要一些ABC对象供其引用。如果您在其他类中创建此语法,则语法将类似于

ABC abcObject;
...
ABC.InnerClass1 newObject = abcObject.new InnerClass1();

10-05 18:58
查看更多