静态方法中的实例变量

Instance variables in static method

我正在准备 Java SE 7 的 OCA 认证,在第一章 Java 基础知识 中,我阅读了以下有关静态方法的内容:

Static methods aren't associated with objects and can't use any of the instance variable of a class.

在下面的例子中,编译器给我一个错误:

class MyClass2 {

    String a;

    public MyClass2() {

    }

    static void check(){
        if (a.equals("TEST"))
            return; 
    }
}

Cannot make a static reference to the non-static field a.

如果我以这种方式更改 class 定义:

class MyClass {

    String a;

    public MyClass() {
        // TODO Auto-generated constructor stub
        check(a);
    }

    static void check(String a){
            if (a.equals("TEST"))
                return; 
    }
}

一切正常,编译器没有显示任何错误,这很奇怪,因为 a 始终是一个实例变量。

在第二个示例中,您 check 有一个名为 a 的参数。相等性检查是针对它执行的,而不是针对实例成员 a 执行的,它实际上仍然无法从 static 上下文访问。

第一种情况发生编译错误 -

  • 你有一个非静态文件String a
  • 您正在尝试通过静态方法 check()
  • 访问 String a

所以才会出现编译错误

在第二种情况下没有发生编译错误 -

  • 您正在从构造函数 MyClass() 中调用静态方法 check()
  • 调用 class 的静态方法而不创建 instance/object 的静态方法是完全有效的。
    这就是为什么您没有收到任何编译错误的原因。

希望对您有所帮助。
非常感谢。

静态方法只能引用静态变量。由于非静态变量不属于 class,而是属于实例化的特定对象...静态方法无法知道要显示哪些变量。例如,您创建了两个 MyClass

实例
MyClass x,y;
x.a =10;
x.b=20;

那么就无法知道从静态函数中选择哪个是正确的,因为静态函数不与任何特定实例(x 或 y)相关联。

因此,如果您想访问变量 a,则需要将其声明为静态变量。

static String a;

BUT,在您的第二种情况下,您有一个 as 参数,因此在引用参数代替 class 级别变量时没有错误。如果您想要错误,请使用 this.a 来引用 class 级别变量。

当您将实例变量传递给静态方法(或与此相关的任何其他方法)时,您传递的是该变量的值。不是变量本身。这可能就是您没有收到错误的原因。 但是,变量本身不可用。