为什么这段代码的输出都是2?

时间:2013-04-30 09:33:56

标签: java arrays concatenation

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; 

3 个答案:

答案 0 :(得分: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; 
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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