在Java中,当我们想从静态方法访问非静态变量时,会出现编译错误:

“无法静态引用非静态字段nonStatic”

但是我使用静态方法创建了另一个类,并且可以达到该非静态变量。为什么是这样?

因此,在A类中,“ return nonStatic”行和“ nonStatic = 4”行是错误的。但是在类App方法m中,而类B方法m正在工作。

public class App
{
    public static void main( String[] args )
    {

        A a = new A();
        m( a  );

        System.out.println(a.nonStatic);

    }

    static void m( A a ) {
        a.nonStatic = 12;  //its good...why?

    }
}

class A{

    int nonStatic = 7;

    static int getOrSetNonStatic(){
        // return nonStatic;  //error
        // nonStatic = 4;     //error
        return 0;
    }

}

class B {

     static void m( A a ) {
            a.nonStatic = 12;   //its good...why?

        }
}

最佳答案

区别在于不是nonStatic是从其他类访问的事实。

尝试在A中执行此操作,它将编译:

class A {
    int nonStatic = 7;
     static void m( A a ) {
            a.nonStatic = 12;
     }
}


那有什么区别呢?您在以下位置读取了静态变量:


a.nonStatic访问实例上的nonStatic。无论此代码在哪里,都可以。
nonStatic中的实例(非静态)方法中简单地输入A类似于a.nonStatic(即this.nonStatic)。这是允许的。
nonStatic内的静态方法中简单地键入A等效于A.nonStatic,这是一个问题,无论它写在哪里。 nonStatic是一个实例字段,因此无法静态访问(在任何地方都可以作为A.nonStatic,或在nonStatic的静态方法中可以作为A

09-05 04:35