java - Java 中的静态变量

标签 java static

根据 Java,静态变量可以通过类名访问,但它们也可以通过类对象访问,即使 Java 不建议这样做,它给出了相同的答案。

我知道变量只有一个副本,它的值对于所有对象和其他事物都是相同的。为什么 Java 建议使用类名而不是类对象?

最佳答案

因为它可能会令人困惑!静态成员没有动态调度。

看看这个令人困惑的代码:(可能是语法错误;我的 Java 生锈了)

public abstract class Singer {
    public static void sing() {
        System.out.println("Singing");
    }
}

public class Soprano extends Singer {
    public static void sing() {
        System.out.println("Singing in the range of C4-A5");
    }
}

public class MyDriver {

    public static void main(String[] argv) {
        Singer  mySoprano1 = new Soprano();
        Soprano mySoprano2 = new Soprano();
        mySoprano1.sing();
        mySoprano2.sing();
    }

}

查看 MyDriver 它令人困惑,因为它看起来像 sing 方法是多态的,所以输出应该是...

Singing in the range of C4-A5
Singing in the range of C4-A5

...因为 soprano1soprano2 都是 Soprano 的实例 - 而不是 Singer

但是,唉,输出实际上是:

Singing
Singing in the range of C4-A5

为什么?因为静态成员没有动态调度,所以 mySoprano1declared 类型决定调用哪个 sing 方法...和声明的类型soprano1 的成员是 Singer,而不是 Soprano

有关更多信息,请查看书中的谜题 48“我得到的都是静态的”Java Puzzlers .

关于java - Java 中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506082/

相关文章:

c++ - 如何初始化静态模板化容器?

html - 上传WordPress静态HTML站点后GitHub上显示404错误

java - Java中的静态 block

java - 可选 ifPresent 返回另一种类型

java - 如何在按下按钮时更改/替换 fragment ?

java - 所有按钮生成相同的事件,生成相同的输出

java - 静态初始化 block 的设计问题

java - 如何获得两个 JDateChooser 对象之间的天数差异

java - 在 Java 中,如何将所有 future 的 System.out.println 输出重定向到我刚刚打开的新终端窗口?

c# - 关于静态构造函数、方法和字段的一些问题