从内部类访问扩展类的方法

时间:2014-12-07 04:36:14

标签: java inner-classes

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中的方法? / p>

提前致谢!

3 个答案:

答案 0 :(得分:3)

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(); 

答案 1 :(得分:1)

静态内部类只能访问外部类的静态成员

所以内部类只能使用xyz的静态成员。

如果要访问所有内容,则创建内部类非静态

答案 2 :(得分:1)

你有两个选项,一个删除静态调用,这样一个隐藏的对外部类的引用可用于内部类实例或两个,当你明确地创建一个内部类传递的实例时,例如: / p>

public class ABC extends XYZ
{
     XYZ.InnerClass innerInst = new InnerClass(this);

          public static class InnerClass1
          {
            private final ABC extref;
            public void Innerclass(ABC outerref) 
            {
                extref = outerref;
            }

            ...
          }
}