Java 试图理解静态变量。为什么在第二个到最后一个打印语句中打印6?

Java 试图理解静态变量。为什么在第二个到最后一个打印语句中打印6?,java,static,Java,Static,我对静态字段的理解是,它的最后一个赋值是该字段在类中的任何位置的值。然而,我的理解显然不可靠,因为我希望第二次到最后一次打印的语句打印30份,而不是6份。请帮助我理解为什么它会打印6 public class Whatever { static int x = 2; static int z; public Whatever() { z = x*3; } public static void main(String[] args) { Whatever foo = new

我对静态字段的理解是,它的最后一个赋值是该字段在类中的任何位置的值。然而,我的理解显然不可靠,因为我希望第二次到最后一次打印的语句打印30份,而不是6份。请帮助我理解为什么它会打印6

public class Whatever 
{
static int x = 2;
static int z;

public Whatever()
{
    z = x*3;
}

public static void main(String[] args) 
{
    Whatever foo = new Whatever();

    System.out.println(foo.z); //prints 6

    Whatever.x = 10;

    System.out.println(foo.x); // prints 10
    System.out.println(foo.z); // prints 6 WHY?!?!

    Whatever bar = new Whatever();

    System.out.println(bar.z); // prints 30 as expected
}
}
看一看

当从同一个类蓝图创建多个对象时,每个对象都有各自不同的实例变量副本。(……)

有时,您希望拥有对所有对象通用的变量。这是通过“静态”修改器完成的。声明中包含静态修饰符的字段称为静态字段或类变量

Whatever.x = 10; // This only sets your "x" to 10.

System.out.println(foo.x); // prints 10
System.out.println(foo.z); // prints 6 - because x is 10, but z is still 6

Whatever bar = new Whatever(); // Now z = x*3 is called and z becomes 30.

System.out.println(bar.z);

只是当您为
x
设置一些新值时,构造函数
z=x*3
中的语句并不总是被调用,静态变量之所以被调用,是因为它们位于内存中的静态。当您实例化foo对象时,构造函数将x乘以3,并将结果分配给z

当你的主要方法开始时

x=2且z尚未实例化

当foo被实例化时

x=2,z=x*3。因为x现在是2,z=2*3=6

然后将x指定为10。 Z仍然是6,因为在调用条形图对象之前,Z不会被指定

如果您希望在该时间点达到30岁,则必须再次调用z=x*3


更改变量x不会自动更改z的值

静态变量在不同实例中只有一个实例

这里

起初

Z是2

当你打电话的时候

public Whatever()
Z改为6

在那之后你改变了X

但这对Z没有影响

所以这个值是6


谢谢

要理解这一点,您需要知道
静态
的含义。在Java中,
静态
变量位于类级别。另一种思考方式是,该类的所有实例都看到相同的东西。因此,在您的示例中,无论您创建了多少个
Whatever
对象(即使您一个也不创建!),只有一个
x
和一个
z

所以,让我们来看看

// Executes z = x*3, setting z to 6 (as you expect)
Whatever foo = new Whatever();
System.out.println(foo.z); //prints 6

// Sets x to 10 (remember, x is static, you only have one of them!)
Whatever.x = 10;
System.out.println(foo.x); // prints 10

// Because since the last time you've created a Whatever, 
// nothing has changed z!
System.out.println(foo.z); // prints 6 WHY?!?!

// Now you've created a new Whatever, and z = x*3 gets executed
// in the constructor again
Whatever bar = new Whatever();


System.out.println(bar.z); // prints 30 as expected

我希望这有帮助

因为z=x*3在构造函数方法中。 构造函数方法是在编写时调用的

Whatever foo = new Whatever();
所以当你分配

Whatever.x = 10; 

构造函数方法没有再次调用

让c逐行了解发生了什么

公共静态void main(字符串[]args) {

}


希望这有帮助

在问这个问题之前,我已经阅读了你链接到我的整个页面。对不起,你的回答没用。@KacyRaye好吧,你从来没有提到你读过:)但我很高兴你读过!哈哈,真冷。是的,我现在做我的研究,因为上次我的帐户因为问了一个“低质量的问题”而被禁止了>。我意识到这对z没有影响。。。我想知道为什么它对z没有影响。我们在第一行给了你答案——静态变量在不同的实例中只有一个实例。哦!好的,它只是点击!就像我输入:
intx=2
intz=x*3
x=10
System.out.println(z)//将打印6个
z=x*3
System.out.println(z)//将打印30个
抱歉,我不知道如何将其全部放在一个代码块中。我是新来的。非常感谢。我点击了“向上箭头”按钮,因为你的回答也帮助了我的理解,但不幸的是,我先读了另一个人的答案。谢谢你!没问题:)只要你的疑虑消除了,不管是我还是其他人!
Whatever foo = new Whatever(); // new is a operator to create an object. when the object is created it will try to call constructor . No constructor, it will fail to create the object. so Now the constructor is called. It calculates x*3 and puts the value to z.
System.out.println(foo.z); //prints 6. Here value of z is read printed. This is not method invocation. This is just reading value of z 
Whatever.x = 10; // This is an assignment statement. It just puts the value into x
System.out.println(foo.x); // prints 10 Just the values read 
System.out.println(foo.z); // prints 6 WHY?!?! // Here to value of z is read. If you see. now alteration of value is done on z. 
Whatever bar = new Whatever(); // this recalculates and puts the value on to z. That is why you are seeing change when you print z after this statement.
System.out.println(bar.z); // prints 30 as expected
System.out.println(foo.z); // Should also print 30 now. thats what static does