2

我正在学习如何使用内部类,但是当我尝试编译它时遇到了一个令人不安的错误。我试图了解内部类和外部类如何使用彼此的变量和方法。

当我尝试编译这段代码时,它说:

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

    }
}

在此先感谢您的帮助!

4

2 回答 2

3

Since getInnerX() method is defined in MyInner class. You can't access it directly without the object of MyInner class .So change the line

 System.out.println("inner.x = " + inner.getInnerX());  

to

System.out.println("inner.x = " + outer.inner.getInnerX());
于 2013-08-29T19:07:15.327 回答
2

如前所述,您首先需要inner在引用静态 main 方法之前提取变量。尝试以下操作:

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

了解实例和类成员

声明中带有 static 修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量。

由于您的内部变量与对象相关联,因此不能像静态变量那样引用它。如果它是静态的,它将在“MyOuter”的所有实例之间共享,并且可以按照您在那里尝试的方式进行访问。

于 2013-08-29T19:09:35.393 回答