Javaによると、静的変数はクラス名でアクセスできますが、Javaが提案していなくてもクラスオブジェクトからもアクセスでき、同じ答えが得られます。
変数のコピーは 1 つだけで、その値はすべてのオブジェクトやその他のもので同じになることがわかっています。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
... と の両方soprano1
がsoprano2
-not のインスタンスであるSoprano
ためSinger
です。
しかし残念なことに、出力は実際には次のようになります。
Singing
Singing in the range of C4-A5
なんで?静的メンバーには動的ディスパッチがないため、 の宣言された型によって呼び出されるメソッドがmySoprano1
決まります...そして、 の宣言された型はではなくです。sing
soprano1
Singer
Soprano
詳細については、書籍Java Puzzlersのパズル 48「All I get is static」を参照してください。
MyClass.staticVariable
よりも書いた方が自己文書化されますmyObject.staticVariable
。クラスの特定のインスタンスではなくstaticVariable
、 のプロパティであるコードを見ている人に伝えます。MyClass
myObject
私が考えることができる1つのポイントは、オブジェクトの代わりにクラス参照を使用する場合、JVMはnew
その静的変数にアクセスするためにオブジェクトを作成する必要がまったくないということです。これは、パフォーマンスのための優れたプログラミング手法です。