[英]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.