java 静态方法访问静态变量

g6ll5ycj  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(162)
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吗?

e5nqia27

e5nqia271#

functionA中定义一个局部变量y:

void functionA() {
    int y = 0;
    ...

当你在这个函数中时,所有对y的访问都将进入这个变量,所以你将它设置为30。但是这并不影响静态变量y,它的值仍然是0,并且它是从静态方法functionZ访问的。
为了强调您希望访问静态变量y而不是局部变量y,请使用限定标识符Practice.y

rhfm7lfc

rhfm7lfc2#

全局变量和局部变量有很大的区别。全局变量的作用域是整个类。而局部变量的作用域是有限的,只在声明它的方法或块中。
这里你已经声明了静态int y;它是全局变量,可以通过functionZ()访问。
而变量int y=0;在functionA()中声明的是一个局部变量,只能在functionA()方法本身中访问。这意味着其他方法甚至不知道该变量的存在。
假设你去掉了静态int y;而在funtionZ()方法中,你会得到一个错误,因为它找不到任何变量y

相关问题