我写了一个简单的程序,如下所示:
package BasePackage;
public class ParentClass {
static int i=15;
double f=4.5;
public static void main(String[] args) {
ParentClass obj1= new ParentClass();
obj1.i=10;
obj1.printvalue();
System.out.println("The value of i is " +i);
}
public void printvalue()
{
ParentClass obj1= new ParentClass();
int i =30;
obj1.i=25;
System.out.println("The value of i in the method is " +i);
}
}
我得到的输出类似,方法中i的值为30,i的值为25。我的问题是在类级别上i的静态值,即应该打印15,因为不应更改静态值。另外,我正在方法中更改i = 25的值,所以为什么不打印而不是30?
答案 0 :(得分:2)
我的问题是在类级别i的静态值,即应该打印15,因为静态值不应更改。
当变量为静态时,该变量的一个实例仅存在于同一类的所有对象中。因此,当您调用obj1.i = 25
时,您正在更改类的所有实例的i
,包括您当前所在的类的 。< / p>
如果我们逐步执行代码并查看其作用,这可能会更清楚:
public static void main(String[] args) {
ParentClass obj1= new ParentClass();
// Set i for ALL ParentClass instances to 10
obj1.i=10;
// See below. When you come back from this method, ParentClass.i will be 25
obj1.printvalue();
// Print the value of i that was set in printValue(), which is 25
System.out.println("The value of i is " +i); /
}
public void printvalue() {
ParentClass obj1= new ParentClass();
// Create a new local variable that shadows ParentClass.i
// For the rest of this method, i refers to this variable, and not ParentClass.i
int i =30;
// Set i for ALL ParentClass instances to 25 (not the i you created above)
obj1.i=25;
// Print the local i that you set to 30, and not the static i on ParentClass
System.out.println("The value of i in the method is " +i);
}
答案 1 :(得分:1)
int i
是仅在printvalue()
范围内存在的局部变量(此方法应命名为printValue()
)。您将本地变量i
初始化为30。
obj1.i=25
是对象i
中的 static obj1
字段。当用obj
实例化ParentClass obj1= new ParentClass();
时,您正在创建一个ParentClass
实例,其静态i
字段值为10。然后更改obj1.i
的值到25。
这与局部变量int i
无关。
答案 2 :(得分:1)
您有不同的变量(在不同的范围内),都称为i
:
static int i=15;
printvalue()
:int i =30;
您可以从非静态上下文访问静态变量,但不能从静态上下文访问实例变量。
在您的printvalue()
方法中,将本地变量i
设置为值30,然后为静态变量i
设置一个新值(25)。因为两者共享相同的变量名,所以静态变量i
被本地变量“遮盖了”……这就是为什么输出30而不是25的原因。
您也可以看看以下内容:https://dzone.com/articles/variable-shadowing-and-hiding-in-java