面向对象的Java样本考试

时间:2012-01-19 02:55:44

标签: java oop

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();
  }
}

这是一个样本考试的问题,提出输出,答案是正确的 种类:猎鹰,Id:2;种类:鹰,Id:2;

我不明白为什么id为2,两个实例都相同。你能解释一下吗?

6 个答案:

答案 0 :(得分:4)

由于id字段是静态的,因此它在Bird的所有实例的整个(及之外)都具有相同的值。

创建两个Bird对象后,构造函数将被调用两次,因此id将为2

请参阅:Understanding Instance and Class Members

答案 1 :(得分:0)

因为此处private static int id = 0; id已声明为static or class variable。静态变量是类变量,每次创建对象时都不会初始化或创建它们。

因此,只存在一个静态变量副本。不,使用new运算符创建对象时会创建新副本。

答案 2 :(得分:0)

因为idstatic。这意味着它是一个“类变量/字段”,每个类只有一个。该类的所有实例共享它id(确实称之为“id”感觉有点奇怪)。

请参阅here

答案 3 :(得分:0)

与实例变量不同,

静态变量在对象之间共享。所以当执行时

birds[0] = new Bird("falcon");

id增量为1.之后执行以下操作将其递增为2

birds[1] = new Bird("eagle");

答案 4 :(得分:0)

除了静态变量'for'love only put

System.out.print(birds[i]);

不是

System.out.println(birds[i]);

所以直到执行'for'循环结束它只打印一行,因为'for'循环没有{}括号它只循环一行

答案 5 :(得分:-1)

因为我们最后正在调用toString。当toString获取id的值时,返回其始终为2。 最好逐个打印参考文献。