-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 都是相同的,但无法弄清楚为什么输出是 2 而不是 1?

运行时输出:

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

3 回答 3

5

它是一个静态变量..由所有对象实例共享。您创建了两个对象,因此通过构造函数递增了两次.. 老实说,我看不出我还能在答案中添加什么。

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

嗯..如果你想拥有一个唯一的 id,你可以拥有一个对象独有的额外字段,我认为这应该可以解决你的问题:

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

由于idstatic,它由 的所有实例共享Bird。您创建了 2 个对象,并id增加了两次,因此,当您尝试为每个实例2打印时,它被打印了。idBird

于 2013-04-30T09:35:45.020 回答
0

static所有创建的对象共享的变量,它被初始化一次,因此不会在每次创建新对象时都初始化。

由于 id 的初始值为 0 并且您创建了两个新对象。因此该值将增加两次,新值将是 2。

于 2013-04-30T09:37:54.670 回答