Java 试图理解静态变量。为什么在第二个到最后一个打印语句中打印6?
我对静态字段的理解是,它的最后一个赋值是该字段在类中的任何位置的值。然而,我的理解显然不可靠,因为我希望第二次到最后一次打印的语句打印30份,而不是6份。请帮助我理解为什么它会打印6Java 试图理解静态变量。为什么在第二个到最后一个打印语句中打印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
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