[英]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 = 25
后test.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.