我理解静态是什么,但我找不到信息如何通过对象引用静态字段.
让我们假设我们有两个类:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我们运行这个程序时,我们在堆上有一个对象(foo1),在metaspace中有两个类(简化).
当我们通过类访问静态字段时:
int valFromClass = Foo.statValue;
Run Code Online (Sandbox Code Playgroud)
这很简单,因为我假设我们在元空间中引用了类对象.但是如何通过对象访问静态成员?当我们写:
int valFromObject = foo1.statValue;
Run Code Online (Sandbox Code Playgroud)
是实际涉及的Foo实例还是被绕过的
foo1.statValue;
Foo.statValue
Run Code Online (Sandbox Code Playgroud)
是同义词?
事实上实际上没有使用.Java使用变量的类型,然后读取静态(类)字段.
这就是为什么即使是具有正确类型的null也不会引发空指针异常.
试试这个:
Foo foo1 = null;
int valFromObject = foo1.statValue; //will work
Run Code Online (Sandbox Code Playgroud)
或这个:
int valFromNull = ((Foo)null).statValue; //same thing
Run Code Online (Sandbox Code Playgroud)
由于显而易见的原因,不鼓励通过实例访问静态类成员(在我看来,最重要的是被引用实例成员的错觉).Java允许使用foo1.statValue警告("The static field Foo.statValue should be accessed in a static way"由我的IDE报告).