2012-04-21 12 views
0

私は静的という単語のマップされたアイデアを与えようとしています(私の現在の名詞の静的な定義を使用し、形容詞の定義をよく理解していない)が、静的ではない変数やメソッドは、 (またはより良い前記参照/参照)をオブジェクト/インスタンスに貼り付ける。では、宣言されたメソッド/変数について実際に記述している用語は何ですか?静的とは、「固執している」と言いますか?

+1

状況によって異なります。どんなプログラミング言語について話していますか? –

+1

スタティックはクラスに「スタック」しています。非静的なものは、クラスのインスタンスに「スタック」しています。 – Jack

+0

@MattBall私はJavaを参照していましたが、他の言語(JS、Python、Ruby)にもっと精通しています。 –

答えて

2

「静的」および「動的」という用語は、プログラミング用語の反対語として頻繁に使用されます。

ダイナミックなものは何か変わるものです。クラスの文脈では、各インスタンス(オブジェクト)で異なる値や振る舞いをとるものです。

静的なものは変更されません。それは静止している。したがって、クラスの静的変数は、各インスタンスで異なる値を取ることはありません。

静電気は移動しません。それはあなたの靴下の一つの場所に詰まっています。ダイナミックな電気は、ワイヤー内を動くと、はるかに強力なことをすることができます。

1

私はここで、この質問は非常に詳細な回答を提供して思う:staticWhat is "static"?

コンセプトは何かがクラスまたはオブジェクト(インスタンス)の一部であるかどうかに関係しています。 staticとして宣言されているmain方法の場合

、それはmainメソッドがクラスメソッドであることを言う - クラスの一部である方法ではなく、オブジェクトの一部。つまり、ClassName.methodを参照することによって、別のクラスが別のクラスのクラスメソッドを呼び出すことができます。例えば、MyClassの実行方法により達成される呼び出す:一方

MyClass.main(new String[]{"parameter1", "parameter2"}); 

static修飾語なしメソッドまたはフィールドは、オブジェクトの一部(あるいはまた、「インスタンス」と呼ばれる)であることを意味しますクラスの一部ではありません。を有する方法またはフィールドの値を、各インスタンスとして

MyClass c1 = new MyClass(); 
c1.getInfo()  // "getInfo" is an instance method of the object "c1" 

異なる値を有することができる:クラス名ではなく、メソッドまたはフィールドが属した特定のオブジェクトの名前で呼ばれています異なるオブジェクトの同じ名前が必ずしも同じである必要はありません。インスタンスとクラスの変数の2つの概念を組み合わせると、同じオブジェクトが同じ名前である必要はありません。

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. 

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変数のインスタンスを持っており、static修飾子で宣言されたクラス変数classVariable:我々は、インスタンスとクラス変数とメソッドの両方を含む新しいクラスを宣言しましょう。同様に、値を取り出すインスタンスとクラスのメソッドがあります。

インスタンスのコンストラクタは、引数としてインスタンス変数に割り当てる値をとります。クラス変数は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は、インスタンスメソッドであるが、インスタンスac1ac2を参照して呼び出された場合、両方とも同じ値42を返します。どちらのインスタンスメソッドでも、インスタンスにではなくクラス固有のクラスメソッドclassVariableを参照しているため、クラスAnotherClassの場合はclassVariableのコピーが1つしかないためです。

static修飾子が何のために使用されているかを明確にすることを望みます。

The Java Tutorials Sunからは、と呼ばれるセクションがあります。このセクションも2種類の変数とメソッドに分かれています。

+0

これは理論的に質問に答えるかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう(http://meta.stackexchange.com/q/8259)。 –

関連する問題