2015-02-23 20 views
-2

所以我正在嘗試爲課堂做作業,但遇到了一個奇怪的問題。每當我在我的類隊列的一個實例中修改變量的大小時,它也會修改類的另一個實例的大小變量。例如Java--一個對象的兩個單獨實例同時被修改

Queue takeoffQueue=new Queue(); 
    Queue landingQueue=new Queue(); 

    System.out.println("TakeoffSize "+takeoffQueue.size); 
    System.out.println("LandingSize "+landingQueue.size); 

    takeoffQueue.size++; 

    System.out.println("TakeoffSize "+takeoffQueue.size); 
    System.out.println("LandingSize "+landingQueue.size); 

會打印出:

TakeoffSize 0

LandingSize 0

TakeoffSize 1

LandingSize1

有誰知道這是爲什麼?

+2

你的隊列在哪裏? – SMA 2015-02-23 05:40:36

+3

如果'size'變量爲'static',可能會發生這種情況 – Titus 2015-02-23 05:41:34

+0

不使用隊列中的靜態變量 – 2015-02-23 05:42:16

回答

1

你可以這樣看待(簡體):

靜態變量是全班級的。如果您將值設置爲靜態變量,則意味着它適用於該類的所有過去,當前和當前實例。

另一方面,實例變量定義了一個屬性,該屬性綁定到一個特定的問題實例。

再次,通俗地說:

public class Person { 
    public static int NUMBER_OF_EYES = 2; 
    public int numberOfHealthyEyes; 
} 

這是合理的假設,所有的人有2個眼睛,而且是全人類共享的功能。但是,個人(人的實例)可能具有不同數量的健康眼睛。有些人可能是盲人,所以他們的數字爲0,依此類推。長話短說,當你需要描述一個類的實例的內部狀態的一部分時,你可以使用實例變量。當你想描述一個共享屬性時,你可以使用靜態屬性。

以下是一個Java TOT甲骨文頁有關變量的聯繫:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

0

也許我遲到了,但只是想staticnon-static之間的差異解釋到accoding我的觀點。

我認爲(就像你提到聲明的大小變量)size你聲明的變量是一個靜態變量,它會爲內存中該類的所有對象產生相同的值。

靜態:

所以,當你做

static int size=0; 
Queue takeoffQueue=new Queue(); 
Queue landingQueue=new Queue(); 

什麼記憶發生

Static varible common memory

size varible是該類的所有OBJETS之間共享,所以如果你改變值爲size任何對象它會b e也影響到其他物體。

非靜態:

如果你已經做了

int size=0; 
    Queue takeoffQueue=new Queue(); 
    Queue landingQueue=new Queue(); 

該類的每個對象創建會像

Non-static varible each variable have its own space

內存在這種情況下會有他們自己的size可變因此如果你增加size一個對象的變量不會影響其他的大小變量。

你可以選擇你想要的變量類型。如果您有同一所學校的Student班,那麼變量schoolName將是靜態的,因爲學校名稱對於所有學生(對象)都是相同的,優點是它節省了內存,而不是爲每個對象創建非靜態的schoolName。並且另一方面,變量studentName將是非靜態的,因爲它對於eact對象是不同的。

相關問題