4

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

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

4

3 回答 3

6

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

看看这个令人困惑的代码:(可能是语法错误;我的 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

...因为两者soprano1和都是-notsoprano2的实例。SopranoSinger

但唉,输出实际上是:

Singing
Singing in the range of C4-A5

为什么?因为静态成员上没有动态分派,所以声明的类型mySoprano1决定了调用哪个sing方法……而声明的类型soprano1Singer,不是Soprano

有关更多信息,请查看Java Puzzlers中的 Puzzle 48 “All I get is static” 。

于 2012-09-20T04:32:45.330 回答
4

如果你写的话,它MyClass.staticVariablemyObject.staticVariable. 它告诉查看代码的人staticVariable是 的属性MyClass,而不是myObject类的特定实例。

于 2012-09-20T04:33:29.730 回答
0

我能想到的一点是,如果您使用类引用而不是对象,JVM 根本不需要创建new对象来访问该静态变量。这是提高性能的良好编程实践。

于 2012-09-20T05:01:18.193 回答