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



在Java中,当我们想从静态方法访问非静态变量时,我们得到一个编译错误:

"无法对非静态字段进行静态引用 非静态">

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

所以在类 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。无论此代码在哪里,都可以。
  • 只需在A内部的实例(非静态(方法中键入nonStatic类似于a.nonStatic(即this.nonStatic(。这是允许的。
  • 简单地在A内部的静态方法中键入nonStatic等效于A.nonStatic,无论它写在哪里都是一个问题。 nonStatic是一个实例字段,因此不能静态访问它(A.nonStatic任何地方,或nonStatic在静态方法中A(

因为你把它作为参数传递到方法中。

如果给方法参数一个不同的名称,也许会更清楚。然后,您将看到成员字段不可见,而仅在参数名称下可见。

最新更新