ArrayList只添加最后一个元素

下面有一个for循环代码。我通过调用自定义显示函数发现aBook arrayList对象只添加了最后一个类对象三次。 为什么会这样?

Scanner s = new Scanner(System.in); ArrayList aBook = new ArrayList(); // taking input for every LifIAddressBook and adding them to the ArrayList. for (int i = 0; i < 3; i++) { System.out.println("Entry " + i+1); System.out.print("Please Enter First Name: "); String a = s.nextLine(); System.out.println(); System.out.print("Please Enter Last Name: "); String b = s.nextLine(); System.out.println(); System.out.print("Please Enter Street Address: "); String c = s.nextLine(); System.out.println(); System.out.print("Please Enter City: "); String d = s.nextLine(); System.out.println(); System.out.print("Please Enter Zip Code: "); int e = s.nextInt(); // in the next line we need to fire a blank scan function in order consume the nextLine. because after executing s.nextInt compiler skip a scan function for a weird reason s.nextLine(); System.out.println(); LiFiAddressBook x = new LiFiAddressBook(a, b, c, d, e); aBook.add(x); } 

这是我的LiFiAddressBook类

 public class LiFiAddressBook { static String first_name, last_name, street_address, city_state; static int zip_code; public LiFiAddressBook(String first, String last, String street, String city, int zip) { //constructor for class object. first_name = first; last_name = last; street_address = street; city_state = city; zip_code = zip; } public String get_first() { return first_name; } public String get_last() { return last_name; } public String get_address() { return street_address; } public String get_city() { return city_state; } public String get_zip() { return Integer.toString(zip_code); } public static void display() { System.out.println("First Name: "+first_name); System.out.println("Last Name: "+last_name); System.out.println("Street Address"+street_address); System.out.println("City State: "+city_state); System.out.println("Zip Code: "+zip_code); } 

}

因为static关键字,每次都是构造函数
public LiFiAddressBook(String , String , String , String , int )
被称为旧值被新值覆盖,并且当列表中的元素打印时,LiFiAddressBook类的对象的变量指向相同的对象。 因此打印类似的对象。

要清楚,实际上有3个LiFiAddressBook实例。 但是那些LiFiAddressBook实例的变量/属性引用了相同的对象。

删除static关键字。 实质上,该关键字确保这些变量只有一个实例。

使:

 static String first_name, last_name, street_address, city_state; static int zip_code; 

成:

 String first_name, last_name, street_address, city_state; int zip_code; 

你可能还需要改变这个:

 public static void display() { 

至:

 public void display() {