Java:为什么可以从类外部的静态方法访问非静态变量?

时间:2019-04-27 16:25:07

标签: java

在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?

        }
}

2 个答案:

答案 0 :(得分:2)

因为您将它作为参数传递给了方法。

如果为方法参数指定其他名称,可能会更清楚。然后您会看到,成员字段不是作为a可见的,而仅在参数名称下可见。

答案 1 :(得分:2)

与众不同的不是nonStatic是从其他类访问的事实。

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

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

那么有什么区别呢?这是在以下位置读取静态变量的内容:

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