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

Java 如何通过对象引用静态字段?,java,oop,static,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.

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

让我们假设我们有两个类:

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

是同义词吗?

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

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

试试这个:

Foo foo1 = null;
int valFromObject = foo1.statValue; //will work
或者这个:

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

由于明显的原因,不鼓励通过实例访问静态类成员(在我看来,最重要的是存在引用实例成员的错觉)。Java允许使用带有警告的
foo1.statValue
“静态字段Foo.statValue应以静态方式访问”
,正如我的IDE所报告的那样)。

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

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

试试这个:

Foo foo1 = null;
int valFromObject = foo1.statValue; //will work
或者这个:

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

由于明显的原因,不鼓励通过实例访问静态类成员(在我看来,最重要的是存在引用实例成员的错觉)。Java允许使用
foo1.statValue
,并带有警告(
“静态字段Foo.statValue应以静态方式访问”
,正如我的IDE所报告的那样)。

foo1的静态类型(用于声明变量的类型,在本例中为
Foo
)用于访问静态字段。实际实例不起作用。请注意,
foo1.statValue
将产生编译器警告。您甚至不应该这样编写代码。静态类型
foo1
(用于声明变量的类型,在本例中为
Foo
)用于访问静态字段。实际实例不起作用。请注意,
foo1.statValue
将产生编译器警告。你甚至不应该写这样的代码。我仍然想知道为什么他们允许
foo1.statValue我还在想为什么他们允许
foo1.statValue首先。