繁体   English   中英

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

[英]Java Variable Scope - Instance and class 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

究竟发生了什么以及我需要做些什么来获得我的预期输出?

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

}

这是因为您将其更改为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 = 25test.getValue或删除static上修改classVar定义。

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

静态变量内存在编译时分配,它们在加载时加载并在类初始化时初始化,并且在实例变量的情况下,一切都在运行时完成。

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

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

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

引用此线程以便清楚地理解: 类变量和实例变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM