私は静的という言葉のマッピングされた考えを自分自身に与えようとしています(形容詞の定義をよく理解していない、静的の現在の名詞定義を使用しています)が、非静的変数とメソッドは実際には「スタック」しているようですオブジェクト/インスタンスへの(またはより適切に参照/参照する)。では、宣言されたメソッド/変数について実際に説明している静的という用語は何ですか?
2 に答える
「静的」と「動的」という言葉は、プログラミング用語では反対語としてよく使用されます。
動的なものは変化するものです。クラスのコンテキストでは、インスタンス (オブジェクト) ごとに異なる値または動作を取るものです。
静的なものは変化しません。それは停滞しています。したがって、クラスの静的変数は、インスタンスごとに異なる値を取りません。
静電気は動かない。靴下の1か所にくっついています。動的電気は、ワイヤで動いており、はるかに強力なことができます。
ここのこの質問は非常に詳細な答えを提供すると思います: 「静的」とは何ですか?
の概念は、static
何かがクラスまたはオブジェクト (インスタンス) の一部であるかどうかに関係しています。
main
として宣言されているメソッドの場合、そのメソッドはクラス メソッド (オブジェクトの一部ではなく、クラスの一部であるメソッド) であるstatic
と言います。main
これは、別のクラスがClassName.method
. たとえば、 の run メソッドを呼び出すには、次のMyClass
ようにします。
MyClass.main(new String[]{"parameter1", "parameter2"});
一方、static
修飾子のないメソッドまたはフィールドは、それがオブジェクト (または「インスタンス」とも呼ばれる) の一部であり、クラスの一部ではないことを意味します。クラス名ではなく、メソッドまたはフィールドが属する特定のオブジェクトの名前で参照されます。
MyClass c1 = new MyClass();
c1.getInfo() // "getInfo" is an instance method of the object "c1"
各インスタンスは異なる値を持つ可能性があるため、異なるオブジェクトの同じ名前を持つメソッドまたはフィールドの値は、必ずしも同じである必要はありません。
MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();
c1.value // The field "value" for "c1" contains 10.
c2.value // The field "value" for "c2" contains 12.
// Because "c1" and "c2" are different instances, and
// "value" is an instance field, they can contain different
// values.
インスタンス変数とクラス変数の 2 つの概念を組み合わせます。インスタンスとクラスの両方の変数とメソッドを含む新しいクラスを宣言するとします。
class AnotherClass {
private int instanceVariable;
private static int classVariable = 42;
public int getInstanceVariable() {
return instanceVariable;
}
public static int getClassVariable() {
return classVariable;
}
public AnotherClass(int i) {
instanceVariable = i;
}
}
上記のクラスには、インスタンス変数と、修飾子で宣言されinstanceVariable
たクラス変数があります。同様に、値を取得するためのインスタンス メソッドとクラス メソッドがあります。classVariable
static
インスタンスのコンストラクターは、インスタンス変数に割り当てる値を引数として受け取ります。クラス変数は に初期化され42
、変更されることはありません。
上記のクラスを実際に使用して、何が起こるか見てみましょう。
AnotherClass ac1 = new AnotherClass(10);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
クラス メソッドとインスタンス メソッドの呼び出し方法が異なることに注意してください。名前でクラスを参照する方法AnotherClass
、または名前でインスタンスを参照する方法ac1
。さらに進んで、メソッドの動作の違いを見てみましょう。
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
AnotherClass.getClassVariable(); // Returns "42"
ご覧のとおり、インスタンス変数はオブジェクト (または「インスタンス」) によって保持されるものであり、したがって、その特定のインスタンスに固有のものです。この例では、ac1
およびによって参照されるオブジェクトですac2
。
一方、クラス変数はそのクラス全体にのみ固有です。この点をよりよく理解するために、新しいメソッドを に追加しましょうAnotherClass
:
public int getClassVariableFromInstance() {
return classVariable;
}
次に、次を実行します。
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
ac1.getClassVariableFromInstance(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
ac2.getClassVariableFromInstance(); // Returns "42"
はインスタンス メソッドですが、インスタンスとgetClassVariableFromInstance
を参照して呼び出すことでわかるように、どちらも同じ値 を返します。これは、両方のインスタンス メソッドで、インスタンスではなくクラスに固有のクラス メソッドを参照しているためです。クラスには のコピーが 1 つしかありません。ac1
ac2
42
classVariable
classVariable
AnotherClass
static
修飾子の使用目的が明確になることを願っています。
Sunの Java チュートリアルには、 「インスタンスとクラスのメンバーについて」というセクションがあり、2 種類の変数とメソッドについても説明しています。