4

Javaによると、静的変数はクラス名でアクセスできますが、Javaが提案していなくてもクラスオブジェクトからもアクセスでき、同じ答えが得られます。

変数のコピーは 1 つだけで、その値はすべてのオブジェクトやその他のもので同じになることがわかっています。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

... と の両方soprano1soprano2-not のインスタンスであるSopranoためSingerです。

しかし残念なことに、出力は実際には次のようになります。

Singing
Singing in the range of C4-A5

なんで?静的メンバーには動的ディスパッチがないため、 の宣言された型によって呼び出されるメソッドがmySoprano1決まります...そして、 の宣言された型はではなくです。singsoprano1SingerSoprano

詳細については、書籍Java Puzzlersのパズル 48「All I get is static」を参照してください。

于 2012-09-20T04:32:45.330 に答える
4

MyClass.staticVariableよりも書いた方が自己文書化されますmyObject.staticVariable。クラスの特定のインスタンスではなくstaticVariable、 のプロパティであるコードを見ている人に伝えます。MyClassmyObject

于 2012-09-20T04:33:29.730 に答える
0

私が考えることができる1つのポイントは、オブジェクトの代わりにクラス参照を使用する場合、JVMはnewその静的変数にアクセスするためにオブジェクトを作成する必要がまったくないということです。これは、パフォーマンスのための優れたプログラミング手法です。

于 2012-09-20T05:01:18.193 に答える