我了解什么是静态的,但是我找不到有关如何通过对象引用静态字段的信息。
让我们想象一下,我们有两个类:
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),元空间中有两个类(简化)。
当我们通过类访问静态字段时:
int valFromClass = Foo.statValue;
这很容易,因为我假设我们在元空间中引用类对象。但是如何通过对象访问静态成员?当我们写的时候:
int valFromObject = foo1.statValue;
实际上是Foo实例所涉及的,还是被绕过了,并且
foo1.statValue;
Foo.statValue
是同义词吗?
答案 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"
)。