Java 静态方法中的实例变量
我正在准备Java SE 7的OCA认证,在第一章Java基础知识中,我阅读了以下关于静态方法的内容: 静态方法与对象无关,不能使用类的任何实例变量 在下面的示例中,编译器给了我一个错误:Java 静态方法中的实例变量,java,static-methods,Java,Static Methods,我正在准备Java SE 7的OCA认证,在第一章Java基础知识中,我阅读了以下关于静态方法的内容: 静态方法与对象无关,不能使用类的任何实例变量 在下面的示例中,编译器给了我一个错误: class MyClass2 { String a; public MyClass2() { } static void check(){ if (a.equals("TEST")) return; } } 无法对非静
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
始终是一个实例变量。在第二个示例中,check
有一个名为a
的参数。相等性检查是针对它执行的,而不是针对实例成员a
,该实例成员实际上仍然无法从静态
上下文访问。在第一种情况下,编译错误发生时-
- 您有一个非静态字段
字符串a
- 您正试图从静态方法
check()
- 您正在从构造函数调用静态方法
李>check()
- 调用类的静态方法而不创建其实例/对象是完全有效的。
这就是为什么你没有得到任何编译错误李>
非常感谢。静态方法只能引用静态变量。因为非静态变量不属于类,而是属于实例化的特定对象。。。静态方法无法知道要显示哪些变量。例如,您创建了MyClass的两个实例
MyClass x,y;
x.a =10;
x.b=20;
那个么就并没有办法知道从静态函数中选择哪一个是正确的,因为静态函数和任何特定的实例(x或y)都并没有关联
所以,如果您想访问变量a,您需要将其声明为静态变量
static String a;
但是,在第二种情况下,您有一个as参数,因此当引用该参数代替类级别变量时,不会出现错误。如果希望出错,请使用此.a引用类级变量。当您将实例变量传递给静态方法(或任何其他方法)时,您将传递该变量的值。而不是变量本身。这可能就是为什么你没有得到错误。
但是,变量本身不可用。
a.equals(“TEST”)
使用方法参数a
,而不是实例字段(使用相同的变量名称)。构造函数可以将实例字段传递给方法调用,但这对于引用的段落并不重要。在本书第53页,我相信您指的是作者Mala Gupta,他说:“静态方法和静态变量都不能访问类的非静态变量和方法。但事实恰恰相反:非静态变量和方法可以访问静态变量和方法,因为即使不存在类的实例,类的静态成员也存在。“那么,*静态方法不与对象关联,也不能使用类的任何实例变量,这不是真的*好的,我同意调用一个类的静态方法而不创建它的实例/对象是完全有效的,但问题是在这个方法中我传递一个指向stati对象的对象引用,这是我的主要关注点,在上面的程序中,当你调用check(a),参数中有instancevariable,但实际上,假设a=“xyz”,当调用check()方法时,值将被复制到被调用方法“a”的局部变量上,这与实际变量{instance variable}不同,因此您不会遇到任何问题。上面我们已经有了代码,这解释了这个概念。