2012-01-19 71 views
1
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;面向對象的Java示例考試

我不明白爲什麼id是2,兩個實例都是一樣的。你能解釋一下嗎?

回答

4

由於id字段是靜態的,因此它將在Bird的所有實例中(以及外)具有相同的值。

創建兩個Bird對象後,構造函數將被調用兩次,因此id將爲2

請參見:Understanding Instance and Class Members

0

因爲這裏private static int id = 0; ID聲明static or class variable。靜態變量是類變量,它們在每次創建對象時都不會被初始化或創建。

因此,只存在一個靜態變量副本。不,使用new運算符創建對象時會創建新副本。

0

因爲idstatic。這意味着這是一個「類變量/字段」,每個類只有一個。該類的所有實例共享它id(確實稱它爲「id」感覺有點奇怪)。

here

0

靜態變量跨不同實例變量對象共享。所以,當這執行

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

id增量爲1。在此之後,下面執行除靜態變量「for」循環遞增它以2

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

只放

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

不是

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

所以直到執行'for'循環結束時,它只打印一行,因爲'for'循環沒有{}括號它只循環一行

-1

因爲我們最後調用toString。當toString取值爲id時,始終返回2. 更好地逐個打印參考。