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

时间:2015-06-21 13:43:31

标签: 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(String[] args) {
        Roughwork test = new Roughwork();
        System.out.println(classVar);
        test.getValue(30);
        System.out.println(classVar);
    }

}

并且该程序的输出是:

25
30
30

我预计输出为

25
30
25

到底发生了什么以及我需要做些什么才能获得预期的输出?

3 个答案:

答案 0 :(得分:3)

ClassVar声明为static。

public static int classVar = 25;

这意味着它与Roughwork的实例无关。如果你愿意的话,它是一个全局变量。您甚至可以从应用程序中的其他类调用此变量,如下所示:

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);
    }

}

答案 1 :(得分:0)

这是因为您将其更改为30并且不会将其更改回25.(static表示所有类的实例都相同)

    System.out.println(classVar); //25
    test.getValue(30);            //30
    System.out.println(classVar); //30 - you don't change variable back to 25

要解决此问题,请在classVar = 25之后添加test.getValue,或在static定义中删除classVar修饰符。

答案 2 :(得分:0)

静态变量由类的所有实例共享。在实例变量的情况下,每个类的实例都有不同的副本。

静态变量内存在编译时分配,它们在加载时加载并在类初始化时初始化,如果是实例变量,则一切都在运行时完成。

让这个例子变得有趣: 创建Roughwork的新实例,尝试更改值并尝试一下。

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

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

引用此主题以便清楚地理解:Class Variable & Instance Variable