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

swc*_*wch 0 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;
    }
}
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)

是同义词?

ern*_*t_k 5

事实上实际上没有使用.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报告).

  • 我仍然想知道为什么他们首先允许`foo1.statValue;`. (2认同)