web-dev-qa-db-ja.com

静的変数とインスタンス変数:違い?

静的変数とインスタンス変数の違いは何ですか?次の文は私が得ることができないものです:

特定の場合、特定の変数の1つのコピーのみをクラスのすべてのオブジェクトで共有する必要があります。ここでは静的変数が使用されます。
静的変数はクラス全体の情報を表します。クラスのすべてのオブジェクトは同じデータを共有します。

インスタンス変数はクラス全体で使用されるのに対して、静的変数は独自のメソッド内でのみスコープを持つと考えましたか?

19
user2971033

クラス属性のコンテキストでは、staticの意味は異なります。次のようなフィールドがある場合:

private static int sharedAttribute;

次に、クラスの各インスタンス同じ変数を共有するため、1つのインスタンスで変更すると、その変更は以前に作成されたすべてのインスタンスに反映されますまたは変更後。

したがって、オブジェクトaを変更するとbにも影響し、なぜb明確な理由なしに変更。とにかく、この動作が絶対に望ましい場合があります。

  1. クラス定数:それらはconstであるため、すべてのクラスが同じ値にアクセスしても、誰もそれを変更できないため、害はありません。そのクラスのインスタンスがたくさんある場合、メモリを節約できます。ただし、concurrentアクセスについてはわかりません。
  2. 参照カウンタ&coなど、共有される意図された変数.

static変数は、プログラムの開始前にインスタンス化されます。したがって、変数が多すぎると、could起動が遅くなります。

staticメソッドはstatic属性にのみアクセスできますが、これを試す前によく考えてください。

経験則:staticは使用する必要があり、自分が何をしているのかを知っているか、クラス定数を宣言している場合を除き、使用しないでください。

25

テストクラスがあるとします。

class Test{
public static int a = 5;
public int b = 10;
}
// here t1 and t2 will have a separate copy of b
// while they will have same copy of a.
Test t1 = new test(); 
Test t2 = new test();

このようなクラス名で静的変数にアクセスできます

Test.a = 1//some value But you can not access instance variable like this
System.out.println(t1.a);
System.out.println(t2.a);

どちらの場合も、テストクラスのすべてのインスタンスで共有されるため、出力は1になります。一方、インスタンス変数にはそれぞれb(インスタンス変数)の個別のコピーがあります。

 t1.b = 15 // will not be reflected in t2.
 System.out.println(t1.b); // this will print 15
 System.out.println(t2.b); / this will still print 10; 

あなたのクエリを説明することを願っています。

11
user2754122

インスタンス変数

これらの変数は、クラスのインスタンス、つまりオブジェクトに属します。そして、そのクラス(オブジェクト)のすべてのインスタンスには、その変数の独自のコピーがあります。変数に加えられた変更は、そのクラスの他のインスタンスには反映されません。

public class Product {
    public int barcode;
}

クラス変数

これらは静的メンバー変数とも呼ばれ、そのクラスのすべてのインスタンスで共有される変数のコピーは1つだけです。その変数に変更が加えられた場合、他のすべてのインスタンスは変更の効果を確認します。

public class Product {
    public static int barcode;
}

完全な例:

インスタンス変数

public class Main {
    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.barcode = 123456;

        Product prod2 = new Product();
        prod2.barcode = 987654;

        System.out.println(prod1.barcode);
        System.out.println(prod2.barcode);
    }
}

public class Product {
    public int barcode;
}

出力は次のようになります。

123456
987654

次に、インスタンス変数を静的にしてクラス変数に変更します。

クラス変数

public class Main {
    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.setBarcode(123456);
        Product prod2 = new Product();
        prod2.setBarcode(987654);

        System.out.println(prod1.getBarcode());
        System.out.println(prod2.getBarcode());
    }
}

public class Product {
    public static int barcode;

    public int getBarcode() {
        return barcode;
    }

    public void setBarcode(int value){
        barcode = value;
    }
}

非静的メソッドを使用して、バーコードの値を取得および設定して、クラスからではなくオブジェクトから呼び出すことができるようにしました。
出力は次のようになります。

987654
987654

9
Suchi Gupta

クラス変数にはクラスのすべての異なるオブジェクトで共有されるコピーが1つしかありませんが、すべてのオブジェクトにはインスタンス変数の個人用コピーがあります。したがって、異なるオブジェクトのインスタンス変数は異なる値を持つことができます異なるオブジェクトは1つの値しか持つことができません。

4
jeswin

Static(Class)変数とインスタンス変数は両方とも特定のクラスに関連付けられているため、どちらもメンバー変数ですが、クラス変数はクラスのすべての異なるオブジェクトで共有されるコピーを1つだけ持つのに対して、すべてのオブジェクトはインスタンス変数の個人的なコピーです。そのため、異なるオブジェクトにまたがるインスタンス変数は1つの値しか持てませんが、異なるオブジェクトにまたがるインスタンス変数は異なる値を持つことができます。

1

インスタンス変数は、複数のメソッド、コンストラクター、ブロック、またはクラス全体に存在する必要があるオブジェクトの状態の重要な部分によって参照される必要がある値を保持します。静的変数は、そこから作成されるオブジェクトの数に関係なく、クラスごとに各クラス変数の1つのコピーになります。

1
Yel

静的変数Kを作成し、メイン関数で3つのオブジェクトを作成するとします。ob1ob2 ob3;これらのオブジェクトはすべて、変数Kに同じ値を持つことができます。対照的に、変数Kがインスタンス変数である場合、次のように異なる値を持つことができます。ob1.k ob2.k ob3.k

1
sachin

静的キーワードのC/C++定義について考えていると思います。そこで、staticキーワードには多くの用途があります。 Javaでは、静的キーワードの機能は投稿で説明されています。とにかく、あなたはあなた自身のためにそれを試すことができます:

public class Test_Static{
    static int x;
    public static void main(String[] argv){
        Test_Static a = new Test_Static();
        Test_Static b = new Test_Static();
        a.x = 1; // This will give an error, but still compile.
        b.x = 2;
        System.out.println(a.x); // Should print 2
    }
}

同様に、非静的変数の場合:

public class Test_NonStatic{
     int x;
     public static void main(String [] argv){
         Test_NonStatic a = new Test_NonStatic();
         Test_NonStatic b = new Test_NonStatic();
         a.x = 1;
         b.x = 2;
         System.out.println(a.x); // Should print 1.
     }
}
0
avak

1つの静的メンバーと1つの非静的メンバーを持つクラスMyClassを考えます。

_public class MyClass {
    public static int STATICVARIABLE = 0;
    public int nonStaticVariable = 0;
}
_

それでは、main()を作成して、いくつかのインスタンスを作成しましょう。

_public class AnotherClass{  
    public static void main(String[] args) {    
        // Create two instances of MyClass
        MyClass obj1  = new MyClass();
        MyClass obj2  = new MyClass();
        obj1.nonStaticVariable = 30;  // Setting value for nonstatic varibale
        obj1.STATICVARIABLE = 40; //Setting value for static variable       
        obj2.nonStaticVariable = 50;
        obj2.STATICVARIABLE = 60;

        // Print the values actually set for static and non-static variables.
        System.out.println(obj1.STATICVARIABLE);
        System.out.println(obj1.nonStaticVariable);
        System.out.println(obj2.STATICVARIABLE);
        System.out.println(obj2.nonStaticVariable);
    }
}
_

結果:

_60
30
60
50
_

_60_と_obj1_の両方が同じ変数を参照していたため、静的変数の値が_obj2_の両方の時間に出力されることがわかります。非静的変数では、作成される各オブジェクトが非静的変数の独自のコピーを保持するため、出力が異なります。それらに加えられた変更は、別のオブジェクトによって作成された変数の他のコピーには影響しません。

0
user3729220