簡體   English   中英

Java程序的異常行為

[英]Unusual behavior of java program

我是Java的新手,正在嘗試學習它。 我寫了兩個類,如下所示,我希望將其打印為1、2、3,但其輸出為3、3、3。

public class Student{
    private static int indexNumber = 0;

    Student(){
         indexNumber=indexNumber+1;
    }
    public void test() {
         System.out.println(this.getIndexNumber());
    }
    public int getIndexNumber(){
         return indexNumber;
    }
} 

public class College {
    public static void main(String args[]){
        Student student1 = new Student();
        Student student2 = new Student();
        Student student3 = new Student();

        student1.test();
        student2.test();
        student3.test();
    }
}

有人可以幫忙嗎?

indexNumber是靜態的,因此在類的每個實例之間“共享”。

如果需要唯一的遞增ID,請執行以下操作:

static int nextID = 1;
int indexNumber;

Student() {
    indexNumber = (nextID++);
}

這使indexNumber成為一個實例字段,以便每個Student獲得自己的副本。 靜態變量用於跟蹤要分配的下一個ID。

您得到3,3,3,因為您已將變量indexNumber定義為靜態。 因此,當實例化三個學生對象時,indexNumber將獲得值3。要遞增,請將indexNumber定義為實例變量,並將其值作為參數傳遞。

您的字段是靜態的,它將被所有對象共享。

private static int indexNumber = 0;

s1-------->indexNumber<------s2
              ^
              |
              |
              |
              s3

每次實例化時,都會調用構造函數,這會使indexNumber增加1。

indexNumber被聲明為static並且對所有對象都是公共的。 因此,您得到3,3,3

靜態成員與類關聯,而不與任何對象關聯。

靜態成員與所有對象共享。 您沒有索引,您的測試算在內。

由於您已將INDEX NUMBER聲明為靜態,因此,您為該類創建的每個實例都將共享它。 如果您刪除了static關鍵字,將會得到您期望的答案。 這就是為什么對於所有三個對象,您獲得相同的索引號值的原因。 我希望你現在很清楚。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM