7
class MyObject {

static int instanceCounter = 0;

static int counter = 0;

MyObject() {

instanceCounter++;

counter = counter + 1;

}

}

この出力を取得するために静的 int を使用しています。

オブジェクト 1 の instanceCounter の値: 5

MyObject の instanceCounter の値: 5

オブジェクト 1 のカウンターの値: 1

オブジェクト 2 のカウンターの値: 2

オブジェクト 3 のカウンターの値: 3

オブジェクト 4 のカウンターの値: 4

オブジェクト 5 のカウンターの値: 5

しかし、その表示

オブジェクト 1 の instanceCounter の値: 5

MyObject の instanceCounter の値: 5

オブジェクト 1 のカウンターの値: 5

オブジェクト 2 のカウンターの値: 5

オブジェクト 3 のカウンターの値: 5

オブジェクト 4 のカウンターの値: 5

オブジェクト 5 のカウンターの値: 5

私のランナークラス

class RunMyObject {

public static void main(String[] args) {

MyObject Object1 = new MyObject();

MyObject Object2 = new MyObject();

MyObject Object3 = new MyObject();

MyObject Object4 = new MyObject();


MyObject Object5 = new MyObject();

System.out.println(“Value of instanceCounter for Object 1: ” + Object1.instanceCounter);

System.out.println(“Value of instanceCounter for MyObject: ” + MyObject.instanceCounter);

System.out.println(“Value of Counter for Object 1: ” + Object1.counter);

System.out.println(“Value of Counter for Object 2: ” + Object2.counter);

System.out.println(“Value of Counter for Object 3: ” + Object3.counter);

System.out.println(“Value of Counter for Object 4: ” + Object4.counter);

System.out.println(“Value of Counter for Object 5: ” + Object5.counter);

}

}

そして、静的を削除すると、これが表示されます

オブジェクト 1 の instanceCounter の値: 5

MyObject の instanceCounter の値: 5

オブジェクト 1 のカウンターの値: 1

オブジェクト 2 のカウンターの値: 1

オブジェクト 3 のカウンターの値: 1

オブジェクト 4 のカウンターの値: 1

オブジェクト 5 のカウンターの値: 1

4

3 に答える 3

20

instanceCounter は静的変数であるため、すべてのオブジェクトが同じ変数を共有します。各オブジェクトの構築中に instanceCounter をインクリメントしているため、5 つのオブジェクトの作成が終了すると、その値は 5 になります。したがって、すべての sys out で出力が 5 になります。それが静的のポイントです

編集
必要なものを達成するには、次の手順を実行します。

class MyObject  {

    static int instanceCounter = 0;

    int counter = 0;

    MyObject() 
    {
        instanceCounter++;
        counter = instanceCounter;
    }

}
于 2012-11-17T13:32:56.097 に答える
2

の使用法について混乱しているに違いありませんstatic variables

static class variablesクラスごとに 1 回作成されます。non-static class variablesこれらは、すべてのオブジェクト インスタンスに対して作成されるすべてのクラス インスタンスによって共有されます。

したがって、counter変数がの場合、static一度だけ作成され、クラスのすべてのインスタンスで共有されます。

MyObject.counterまたはなどでアクセスする場合、変数はインスタンス変数だけでなくクラス名でもアクセスできるobject1.counterため、同じcounter変数にアクセスしています。static

もしそうならnon-static、あなたのクラスのすべてのインスタンス(またはオブジェクト)は独自の のコピーを持ちますcounter
したがって、それぞれの などObject1Object2すべて独自のcounter変数を持ちます。

そして、それらの値はすべて 1 になるため、出力で 1 が得られます。

アップデート:

コードを変更して、回答の1つのコメントで言及した目的の出力を取得します。

MyObject Object1 = new MyObject();

System.out.println(“Value of Counter for Object 1: ” + Object1.counter);

MyObject Object2 = new MyObject();

System.out.println(“Value of Counter for Object 2: ” + Object2.counter);

MyObject Object3 = new MyObject();

System.out.println(“Value of Counter for Object 3: ” + Object3.counter);

MyObject Object4 = new MyObject();

System.out.println(“Value of Counter for Object 4: ” + Object4.counter);

MyObject Object5 = new MyObject();

System.out.println(“Value of Counter for Object 5: ” + Object5.counter);

System.out.println(“Value of instanceCounter for Object 1: ” + Object1.instanceCounter);

System.out.println(“Value of instanceCounter for MyObject: ” + MyObject.instanceCounter);
于 2012-11-17T13:31:34.113 に答える
2

このようにしたい場合は、別の変数を追加する必要があります。

class MyObject {

    int instanceCounter = 0;

    static int counter = 0;

    MyObject() {

        instanceCounter = counter;
        counter++;
    }
}
于 2012-11-17T13:32:43.763 に答える