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

标签 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

是同义词吗?

最佳答案

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

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

试试这个:

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

或者这个:

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

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

关于java - 如何通过对象引用静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53483241/

相关文章:

java - Java 时间计算负值结果

java - 使用方法中传递的另一个参数获取对象的参数 - Java

matlab - 在 MATLAB 中连接同一父类(super class)的子类数组

c# - 静态类分配

java - 私有(private)最终字段也应该是静态的吗?

java - 如何在退出应用程序后保留变量的值

java - JFace Action 和 ImageDescriptor - 我想显示图像和文本

java - struts 2 - 将参数从一个页面传递到另一个页面

java - 从 json 对象中提取值以达到 Intent

python - 子类化 Tkinter.Tcl