Java中的静态变量如何工作?

时间:2014-04-13 18:01:19

标签: java

执行以下代码时

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方法中有所不同?

6 个答案:

答案 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"进行比较。阅读有关变量范围的更多内容。