我正在学习如何使用内部类,但是当我尝试编译它时遇到了一个令人不安的错误。我试图了解内部和外部类如何使用彼此的变量和方法。
当我尝试编译此代码时,它说:
.../src/MyOuter.java:39: non-static variable inner cannot
be referenced from a static context
代码:
public class MyOuter{
private int x;
public MyInner inner = new MyInner();
public int getOuterX(){
return x;
}
private void doStuff(){
inner.go();
}
class MyInner{
public int getInnerX(){
return x;
}
void go(){
x = 42;
}
}
public static void main(String[] args) {
MyOuter outer = new MyOuter();
outer.doStuff();
System.out.println("outer.x = " + outer.getOuterX());
System.out.println("inner.x = " + inner.getInnerX());
}
}
提前感谢您的帮助!
答案 0 :(得分:3)
由于getInnerX()
类中定义了MyInner
方法。如果没有MyInner
类的对象,则无法直接访问它。因此更改行
System.out.println("inner.x = " + inner.getInnerX());
到
System.out.println("inner.x = " + outer.inner.getInnerX());
答案 1 :(得分:2)
如前所述,在引用静态main方法之前,首先需要提取inner
变量。尝试以下内容:
{
public static void main(String[] args) {
MyOuter outer = new MyOuter();
MyInner inner = outer.inner;
outer.doStuff();
System.out.println("outer.x = " + outer.getOuterX());
System.out.println("inner.x = " + inner.getInnerX());
}
来自Understanding Instance and Class Members:
在声明中包含static修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量。
由于您的内部变量与对象关联,因此无法像静态变量那样引用它。如果它是静态的,它将在“MyOuter”的所有实例之间共享,并且可以按照您在那里尝试的方式访问。