面向对象的java样本考试

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

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

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

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

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

请参阅: 了解实例和类成员

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

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

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

看到这里

与实例变量不同,静态变量在对象之间共享。 所以当这个执行时

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

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

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

除了静态变量’for’循环只放

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

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

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

因为我们最终调用toString 。 当toString获取id值以返回它总是2.更好地逐个打印引用。