静态方法中的实例变量

时间:2015-03-07 08:22:10

标签: java static-methods

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

  

静态方法不与对象关联,也不能使用类的任何实例变量。

在以下示例中,编译器给出了一个错误:

class MyClass2 {

    String a;

    public MyClass2() {

    }

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

无法对非静态字段进行静态引用a。

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

class MyClass {

    String a;

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

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

然后无法知道从静态函数中选择哪一个是正确的,因为静态函数与任何特定实例(x或y)都没有关联。

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

static String a;

但是,在第二种情况下,你有一个as参数,所以当参数被引用代替类级别变量时,没有错误。如果你想要错误,请使用this.a来引用类级变量。

答案 2 :(得分:0)

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

  • 您有非静态归档String a
  • 您正尝试从静态方法String a
  • 访问check()

这就是编译错误发生的原因

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

  • 您正在从构造函数check()调用静态方法MyClass()
  • 在不创建类的实例/对象的情况下调用类的静态方法是完全有效的 这就是为什么你没有得到任何编译错误。

希望它会对你有所帮助。
非常感谢。

答案 3 :(得分:0)

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