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>
提前致谢!
答案 0 :(得分:3)
public class ABC extends XYZ
{
public static class InnerClass1
{
...
}
InnerClass1
不是内部类。这是一个嵌套类,因为单词static
。
如果没有static
,它将是一个内部类。并且该内部类的任何实例都将隐藏引用ABC
(也是XYZ
)。如果内部类调用ABC
或XYZ
的任何实例方法,或者引用这些类中的任何实例变量,它将使用该隐藏引用来调用实例方法或访问实例变量。
因为它是一个嵌套类,所以没有对ABC
(或XYZ
)的隐藏引用。因此,如果您调用实例方法或引用实例变量,则无法执行此操作,因为没有ABC
对象可供使用。 (但是,您仍然可以调用ABC
的静态方法,或引用静态变量。)
我不确定解决方案是什么 - 这取决于您的需求。您不能调用的XYZ
方法实际上可能不需要XYZ
对象来处理,因此这些方法应该是静态的。嵌套类也可能有一些用于访问实例方法的显式ABC
或XYZ
变量;如果你有一个可以处理的对象,你仍然可以从嵌套类中调用实例方法:
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;
}
...
}
}