我正在为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
始终是实例变量。
答案 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)
当您将实例变量传递给静态方法(或任何其他方法)时,您传递该变量的值。不是变量本身。这可能就是你没有收到错误的原因。 然而,变量本身并不可用。