public class Practice {
int x;
static int y;
void functionA() {
int y = 0;
System.out.println("inside non static method functionA()");
x = 10;
y = 30;
System.out.println(x);//10
System.out.println(y);//30
functionZ();
System.out.println(x);//10
System.out.println(y);//30
}
static void functionZ() {
System.out.println("inside static method functionZ()");
System.out.println("y: " + y);//prints 0, thought it was supposed to be 30?
}
public static void main(String[] args) {
Practice s = new Practice();
s.functionA();
}
}
有人能解释一下为什么在执行functionZ()时,y被打印为0而不是30吗?在调用z之前,我们已经在functionA中将值设置为30。既然假设在对象的所有示例中只有一个静态变量的副本,那么它不应该是30吗?
2条答案
按热度按时间e5nqia271#
在
functionA
中定义一个局部变量y:当你在这个函数中时,所有对y的访问都将进入这个变量,所以你将它设置为30。但是这并不影响静态变量
y
,它的值仍然是0,并且它是从静态方法functionZ
访问的。为了强调您希望访问静态变量y而不是局部变量y,请使用限定标识符
Practice.y
。rhfm7lfc2#
全局变量和局部变量有很大的区别。全局变量的作用域是整个类。而局部变量的作用域是有限的,只在声明它的方法或块中。
这里你已经声明了静态int y;它是全局变量,可以通过functionZ()访问。
而变量int y=0;在functionA()中声明的是一个局部变量,只能在functionA()方法本身中访问。这意味着其他方法甚至不知道该变量的存在。
假设你去掉了静态int y;而在funtionZ()方法中,你会得到一个错误,因为它找不到任何变量y