下面有一个for循环代码。我通过调用一个自定义显示函数发现aBook arrayList对象仅添加了最后一个类对象三次。为什么会这样呢?
Scanner s = new Scanner(System.in); ArrayList<LiFiAddressBook> aBook = new ArrayList<LiFiAddressBook>(); // 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类的对象变量将指向相同的对象。因此打印相似的对象。
public LiFiAddressBook(String , String , String , String , int )
需要明确的是,实际上有3个LiFiAddressBook实例。但是这些LiFiAddressBook实例的变量/属性引用的是同一对象。