Java变量范围-实例和类变量

Java变量范围-实例和类变量,java,variables,Java,Variables,我是Java新手,正在努力自学。我写了下面的代码,我想知道为什么输出不是我所期望的。以下是我编写的代码: public class Roughwork { public static int classVar = 25; public void getValue(int a){ classVar = a; System.out.println(classVar); } public static void main(Stri

我是Java新手,正在努力自学。我写了下面的代码,我想知道为什么输出不是我所期望的。以下是我编写的代码:

public class Roughwork {

    public static int classVar = 25;

    public void getValue(int a){
        classVar = a;
        System.out.println(classVar);

    }

    public static void main(String[] args) {
        Roughwork test = new Roughwork();
        System.out.println(classVar);
        test.getValue(30);
        System.out.println(classVar);
    }

}
这个程序的输出是:

25
30
30
我希望输出是

25
30
25

到底发生了什么,我必须做什么才能得到预期的输出?

这是因为你把它改为30,而不是改回25。(
static
表示类的所有实例都是相同的)


若要修复它,请在
test.getValue
之后添加
classVar=25
,或删除
classVar
定义上的
static
修饰符。

该类的所有实例共享一个静态变量。对于实例变量,类的每个实例都有不同的副本

静态变量内存在编译时分配,它们在加载时加载,在类初始化时初始化,对于实例变量,一切都在运行时完成

要使此示例有趣,请执行以下操作: 创建新的粗糙工作实例,尝试更改值并尝试一下

Roughwork test = new Roughwork();
Roughwork test2 = new Roughwork();
System.out.println(classVar);

test.getValue(30);
test2.getValue(25);
System.out.println(classVar);

例如,参考此线程以清楚地理解:

ClassVar声明为静态

public static int classVar = 25;
这意味着它不绑定到
粗糙工作
的实例。如果您愿意,它是一个全局变量。您甚至可以从应用程序中的其他类调用此变量,如下所示:

Roughwork.classVar
要获得预期行为,请将代码更改为:

public class Roughwork {

    public int classVar = 25;

    public void getValue(int a){
        classVar = a;
        System.out.println(classVar);

    }

    public static void main(String[] args) {
        Roughwork test = new Roughwork();
        System.out.println(test.classVar);
        test.getValue(30);
        Roughwork test2 = new Roughwork();
        System.out.println(test2.classVar);
    }

}

删除
静态
关键字。然后去阅读它的作用。@user2810706您正在更改变量的值。为什么你想知道它被更改了?@marounnaroun:我更改的值在(getValue)方法中,所以我想它将被限制在该方法中,最终的classVar值将被视为25而不是2530@user2810706
static
变量在所有实例之间共享。这似乎不起作用。。我仍然得到25 30,如果删除static关键字,它实际上会给出一个编译时错误。我将添加一个固定的代码示例。
public class Roughwork {

    public int classVar = 25;

    public void getValue(int a){
        classVar = a;
        System.out.println(classVar);

    }

    public static void main(String[] args) {
        Roughwork test = new Roughwork();
        System.out.println(test.classVar);
        test.getValue(30);
        Roughwork test2 = new Roughwork();
        System.out.println(test2.classVar);
    }

}