静态方法中的实例变量
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 级别变量。
当您将实例变量传递给静态方法(或与此相关的任何其他方法)时,您传递的是该变量的值。不是变量本身。这可能就是您没有收到错误的原因。
但是,变量本身不可用。
我正在准备 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 级别变量。
当您将实例变量传递给静态方法(或与此相关的任何其他方法)时,您传递的是该变量的值。不是变量本身。这可能就是您没有收到错误的原因。 但是,变量本身不可用。