3 回答
TA贡献1810条经验 获得超4个赞
我的问题是类级别 i 的静态值,即 15 应该打印,因为静态值不应更改。
当变量是静态的时,同一类的所有对象中仅存在该变量的一个实例。因此,当您调用 时obj1.i = 25,您将更改类的所有i实例,包括您当前所在的实例。
如果我们单步执行代码并看看它在做什么,这可能会更清楚:
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);
}
TA贡献1820条经验 获得超10个赞
int i
是一个局部变量,仅存在于 的范围内printvalue()
(此方法应命名为printValue()
)。您将局部变量初始化i
为 30。
obj1.i=25
是Object 中的静态 字段。当您实例化 时,您将创建一个静态字段值为 10 的实例。然后将 的值更改为 25。i
obj1
obj
ParentClass obj1= new ParentClass();
ParentClass
i
obj1.i
这与局部变量无关int i
。
TA贡献1895条经验 获得超3个赞
您有不同的变量(在不同的范围内),它们都被称为i
:
原始整数类型的静态变量:
static int i=15;
原始整数类型的局部变量(仅在其所属方法的范围内可见
printvalue()
:int i =30;
您可以从非静态上下文访问静态变量,但不能从静态上下文访问实例变量。
在您的printvalue()
方法中,您将 local var 设置i
为值 30,然后为 static variable 设置一个新值 (25) i
。因为两者共享相同的变量名,所以静态变量i
被它的本地对应变量“遮蔽”......这就是输出为 30 而不是 25 的原因。
添加回答
举报