执行以下代码时
class Foo {
static int size = 7;
static void changeIt(int size) {
size = size + 200;
System.out.println("size in changeIt is " + size);
}
public static void main(String[] args) {
System.out.println("size = " + size);
changeIt(size);
System.out.println("size after changeIt is " + size);
}
}
答案将是
size = 7
size in changeIt is 207
size after changeIt is 7
我期待的答案是
size after changeIt is 207
为什么静态变量的值在changeIt
方法和main
方法中有所不同?
答案 0 :(得分:6)
为什么staticIt方法和main方法中静态变量的值不同?
值不同,因为您没有更改static
变量size
,您更改了局部变量size
。将代码更改为:
static void changeIt() {
size = size + 200;
System.out.println("size in changeIt is " + size);
}
或者,如果要使用具有相同名称的参数,可以通过使用类名对其进行限定来指定使用static
类变量:
static void changeIt(int size) {
Foo.size = size;
System.out.println("size in changeIt is " + Foo.size);
}
答案 1 :(得分:1)
将size = size + 200
更改为
Foo.size = size + 200;
size在您的方法中是本地的,然后您可以更改所需的变量。
问题是参数名size
等于静态字段size
的名称,因此当您指向该方法时,编译器会考虑局部变量。
答案 2 :(得分:1)
Java和许多其他语言执行所谓的local variable shadowing
。这意味着局部变量size
将“掩盖”类级变量size
。
您可以使用this.size
或从方法签名中删除size
参数来解决此问题。
如果您想了解有关Java的更多详细信息,可以参考JLS 6.4.1。
答案 3 :(得分:1)
你的方法:
static void changeIt(int size)
{
size = size + 200;
System.out.println("size in changeIt is " + size);
}
不更改内部静态成员变量。它需要一个整数并加200。如果您只想让此方法向静态成员变量添加200,则您的函数应如下所示:
static void changeIt()
{
size = size + 200;
System.out.println("size in changeIt is " + size);
}
要了解有关静态变量的更多信息,请查看此处: http://en.wikipedia.org/wiki/Static_variable
答案 4 :(得分:1)
因为您使用参数名称' size'这与静态变量相同。 当您键入
时size = size + 1;
您更改了局部变量的值。使用
ClassName.size += 1;
代替。
答案 5 :(得分:1)
static void changeIt(int size) {
size = size + 200;
System.out.println("size in changeIt is " + size);
}
假设您更换"尺寸"用" x"。然后你可以简单地理解你得到的答案是正确的。 就像那样"尺寸"在changeIt()方法中甚至没有与静态" size"进行比较。阅读有关变量范围的更多内容。