如何通过对象引用静态字段?

时间:2018-11-26 14:27:48

标签: java oop static

我了解什么是静态的,但是我找不到有关如何通过对象引用静态字段的信息。

让我们想象一下,我们有两个类:

class Foo {
    static int statValue = 10;
}

class Bar {
    public static void main(String[] args) {
        Foo foo1 = new Foo();
        int valFromObject = foo1.statValue;

        int valFromClass = Foo.statValue;
    }
}

运行此程序时,堆上有一个对象(foo1),元空间中有两个类(简化)。

enter image description here

当我们通过类访问静态字段时:

int valFromClass = Foo.statValue;

这很容易,因为我假设我们在元空间中引用类对象。但是如何通过对象访问静态成员?当我们写的时候:

int valFromObject = foo1.statValue;

实际上是Foo实例所涉及的,还是被绕过了,并且

foo1.statValue;
Foo.statValue

是同义词吗?

1 个答案:

答案 0 :(得分:5)

实际上不使用该实例。 Java使用变量的类型,然后读取静态(类)字段。

这就是为什么即使具有正确类型的null都不会引发null指针异常。

尝试一下:

Foo foo1 = null;
int valFromObject = foo1.statValue; //will work

或者这个:

int valFromNull = ((Foo)null).statValue; //same thing

出于明显的原因,不建议通过实例访问静态类成员(在我看来,最重要的是幻想引用了实例成员)。 Java允许使用foo1.statValue并带有警告(如我的IDE所报告的"The static field Foo.statValue should be accessed in a static way")。