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

标签 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?

        }
}

最佳答案

造成差异的不是nonStatic。从不同的类访问。

尝试在 A 中这样做,它会编译:

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

那么有什么不同呢?这就是你在上面读取静态变量的内容:

  • a.nonStatic访问 nonStatic在一个实例上。不管这段代码在哪里,都可以。
  • 只需输入 nonStaticA 内的实例(非静态)方法中与a.nonStatic相似 (即 this.nonStatic )。这是允许的。
  • 只需输入 nonStaticA 内的static 方法中相当于A.nonStatic ,无论它写在哪里,这都是一个问题。 nonStatic是一个实例字段,因此不能静态访问它(在任何地方作为 A.nonStatic,或在 nonStatic 的静态方法中作为 A)

关于Java:为什么可以从类外部的静态方法访问非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882556/

相关文章:

java - 分割字符串时数字被删除

java - Java 中 printf ("%*s",indent,message) 的替代方法?

java - 将 Hibernate 查询结果存储到 Hashmap 中

java - 从 Firebase 检索数据时出现 NullPointerException

java - 为什么 eclipse 不允许我输入 Scanner 内容?

java:sortedList类比较错误

java - Hibernate 打开/关闭 session ,DAO 的正确方法

java - 使用jdbc访问excel作为数据库

java - 返回 double 的 int 方法

java - ArrayList 未使用预定义大小进行初始化