我对类变量很困惑。我正在查看Java Doc教程。他们解释了静态变量和方法,但我并不真正理解其中一个概念。他们给了我们一些代码,并问我们会得到什么答案。
注意代码并非完全正确。不是要运行程序,而是要抓住静态变量的概念
代码是这样的:
public class IdentifyMyParts {
public static int x = 7;
public int y = 3;
}
从上面的代码中可以得到代码的输出:
IdentifyMyParts a = new IdentifyMyParts(); //Creates an instance of a class
IdentifyMyParts b = new IdentifyMyParts(); //Creates an instance of a class
a.y = 5; //Setting the new value of y to 5 on class instance a
b.y = 6; //Setting the new value of y to 6 on class instance b
a.x = 1; //Setting the new value of static variable of x to 1 now.
b.x = 2; //Setting the new value of static variable of x to 2 now.
System.out.println("a.y = " + a.y); //Prints 5
System.out.println("b.y = " + b.y); //Prints 6
System.out.println("a.x = " + a.x); //Prints 1
System.out.println("b.x = " + b.x); //Prints 2
System.out.println("IdentifyMyParts.x = " + IdentifyMyParts.x);
//Prints2 <- This is because the static variable holds the new value of 2
//which is used by the class and not by the instances.
我错过了什么因为它说System.out.println(“a.x =”+ a.x); //打印1实际打印2。
答案 0 :(得分:8)
静态变量在类的所有实例中共享。所以a.x
和b.x
实际上指的是同一个东西:静态变量x
。
您基本上是在执行以下操作:
IdentifyMyParts.x = 1;
IdentifyMyParts.x = 2;
所以x最终为2。
编辑:
根据下面的评论,似乎混淆可能是由于//Prints 1
。 //之后的任何内容都是注释,对代码完全没有影响。在这种情况下,注释建议a.x的System.out将打印1,但它不正确(因为经常不维护的注释是......)
答案 1 :(得分:3)
a.x
和b.x
是完全相同的变量,由不同的名称调用。当你一个接一个地打印出来时,他们有到*具有相同的值(最后指定的值),因此两个打印都是2
。
MyClass.staticVar
也可以myClassInstance.staticVar
访问的设计决策。哦,好吧。
*)不完全正确;如果并发线程在两者之间修改它,它们可以给出不同的值。如果你还不知道线程,请忽略它。