繁体   English   中英

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

[英]Java: Why are accessible non-static variables from a static methods outside from the class?

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

        }
}

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

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

区别在于,不是从不同的类访问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在任何地方,或作为A的静态方法中的nonStatic

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM