-5
public class A{
    private static flag;

    public void count(){
        flag++;
    }
}

public class B extends A{
    public void count(){
        super.count();
    }
}

public class C extends A{
    public void count(){
        super.count();
    }
}

}

public class D extends A{
    public void count(){
        super.count();
    }
}

私のクラスが次のように実行されるとしましょう クラス B クラス C クラス D

今、私はクラスDカウントメソッドの後にフラグインスタンス変数の値がどうなるかを知りたいです.

4

4 に答える 4

2

flag++ を 3 回呼び出すだけです。したがって、最終的な値は flag+3 になります (フラグを初期化する必要があります)。ただし、同時実行の問題に注意する必要があります。

于 2012-11-21T05:05:30.453 に答える
1

宣言を修正すると仮定します。

private static int flag;

...誰かがABC、またはDのインスタンスを実際に作成するまで/しないのflag0、それが初期化時に取得する値だからです。

countオブジェクトのインスタンス化とその関数の呼び出しを開始すると(インスタンス化するにはインスタンス化する必要がありますが、そうでcountはありませんstatic)、その値は のコードによって増加しますA#count。であるためstatic、同じメンバーがインスタンス間で共有されます。したがって:

new A().count();
// Now it's 1
new B().count();
// Now it's 2

等。

于 2012-11-21T05:04:05.560 に答える
1

これは静的であるため、何度呼び出しても、どのクラスから呼び出すかに関係なく、毎回インクリメントするだけであれば、その値になります。

それが質問かどうかはわかりません。

于 2012-11-21T04:59:44.703 に答える
1

tldr; 「静的フィールド」または「クラス変数」は、クラス (サブクラスを含む) のすべてのインスタンス間で共有される単一の変数を表します。

場合によっては、すべてのオブジェクトに共通の変数が必要になることがあります。これは static 修飾子で実現されます。宣言に static 修飾子があるフィールドは、静的フィールドまたはクラス変数と呼ばれます。[静的フィールド] は、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の 1 つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

その特定の名前を持つ変数は1 つだけです。この場合、クラス修飾名はA.flag(パッケージを前に付けると完全修飾名になります)。Java では、インスタンス修飾された方法で静的フィールドにアクセスすることが許可されています。これは、歴史的な間違いと考えられます..静的フィールドはインスタンスとは無関係に存在するためです。

于 2012-11-21T05:10:31.760 に答える