-4
public class Bird
{
private static int id = 0;
private String kind;
public Bird(String requiredKind)
{
    id = id + 1;
    kind = requiredKind;
}
public String toString()
{
    return "Kind: " + kind + ", Id: " + id + "; ";
}
public static void main(String [] args)
{
    Bird [] birds = new Bird[2];
    birds[0] = new Bird("falcon");
    birds[1] = new Bird("eagle");
    for (int i = 0; i < 2; i++)
        System.out.print(birds[i]);
    System.out.println();
}
}

int は静的であるため、両方の ID が同じになることは理解していますが、出力が 1 ではなく 2 である理由がわかりません。

実行時の出力:

Kind: falcon, Id: 2; Kind: eagle, Id: 2; 
4

3 に答える 3

5

これは静的変数です..すべてのオブジェクト インスタンスで共有されます。2 つのオブジェクトを作成したため、コンストラクターを介して 2 回インクリメントされます。正直なところ、答えにさらに何を追加できるかわかりません。

   //where [x] denotes id:
    First instance: id = [0] + 1; //id is 1 
    Second instance id = [1] + 1 // id is 2 

ええと..一意のIDが必要な場合は、オブジェクトに一意の追加フィールドを1つ持つことができます。これで問題が解決すると思います:

private int Id; 
private static int tracker;
public Bird()
{
    //keep track of object instances, yet each increment is unique to a particular 
    //object
   Id = ++tracker; 
}
于 2013-04-30T09:35:38.540 に答える
1

idであるためstatic、 のすべてのインスタンスで共有されますBird。2 つのオブジェクトを作成し、id2 回増分したため、インスタンスごと2に印刷しようとすると印刷されました。idBird

于 2013-04-30T09:35:45.020 に答える
0

static作成されたすべてのオブジェクトで共有される変数は、一度初期化されるため、新しいオブジェクトを作成するたびに初期化されるわけではありません。

id の初期値は 0 で、2 つの新しいオブジェクトが作成されています。したがって、値は 2 回インクリメントされ、新しい値は 2 になります。

于 2013-04-30T09:37:54.670 に答える