3

我对类变量感到很困惑。我正在查看 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("ax = " + ax); //打印1实际上打印2。

4

2 回答 2

8

静态变量在类的所有实例之间共享。所以实际上指的是同一件事:静态a.x变量。b.xx

您实际上是在执行以下操作:

IdentifyMyParts.x = 1;
IdentifyMyParts.x = 2;

所以 x 最终为 2。

编辑: 根据下面的评论,似乎混淆可能是由于//Prints 1. // 之后的任何内容都是注释,对代码完全没有影响。在这种情况下,评论建议 System.out of ax 将打印 1,但这是不正确的(因为不经常维护的评论是......)

于 2013-10-31T00:16:07.853 回答
3

a.xb.x是完全相同的变量,用不同的名称调用。当您将它们一个接一个打印出来时,它们必须*具有相同的值(最后分配的值),因此两个打印件都是2.

顺便说一句,我真的不喜欢允许MyClass.staticVar也可以作为myClassInstance.staticVar. 那好吧。


*) 不完全正确;如果并发线程在两者之间修改它,它们可以给出不同的值。如果您还不了解线程,请忽略这一点。

于 2013-10-31T00:21:30.037 回答