类的实例可以修改static / class变量吗?

时间:2014-04-22 18:06:49

标签: java

class Person {
  public static int age = 10;
}

public class Application {
  public static void main(String[] args) {

    Person p = new Person();
    p.age = 100;
    System.out.println(Person.age);

    Person.age = 22;
    System.out.println(p.age);
  }
}

我打印了100和22。我认为类的实例无法访问/修改类/静态变量是错误的。

3 个答案:

答案 0 :(得分:1)

是的,他们可以。来自docs

声明中包含静态修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。 任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量

答案 1 :(得分:1)

当然,如果一个类的实例可以访问该范围,则它可以访问和修改静态字段。

不可能发生的是静态语句/方法体修改它不“知道”的实例,例如使用this的静态方法。

示例

public class Main {
    private static int meh = 0;
    int blah = 0;
    public static void main(String[] args) {
        // ugly but compiles fine
        // equivalent to Main.meh = 1
        meh = 1;
        // Will NOT compile - main method is static, 
        // references instance field "blah" out of scope
        // Equivalent to this.blah = 1
        blah = 1;
    }
}

答案 2 :(得分:1)

我认为你所困惑的部分是静态的含义。类Person中的age变量将在Person的所有实例之间共享,并且可以通过以下任何实例访问:

Person.age = 100;

为任何实例更改它:

Person p = new Person();   
p.age = 100;

为每个人更改它,与调用

相同
Person.age = 100;

以非静态方式更改它,意味着通过某些实例仅通过让人们认为他们正在乍一看更改实例变量来使代码产生误导。您将收到编译器警告。