为什么我一直只获得Java ArrayList中的最后一个对象值?

我已设法将所有对象放入arraylist但我无法打印所有值。 无论使用何种方法,只有最后一个打印。

它不是仅通过ArrayList打印的,这让我想知道推送的对象是否相同。

如果是,我该如何改变? 我已经附加了程序(运行FileInput.java):

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Scanner; import java.util.StringTokenizer; import javax.swing.text.html.HTMLDocument.Iterator; //lecture notes(L1) method public class FileInput { static String first; static String second; static String third; static String fourth; static String fifth; static String sixth; static int num = 1; public static void main(String[] args)throws FileNotFoundException, IOException{ Scanner input = new Scanner(new File("player.txt")); String data = null; PrintWriter output = new PrintWriter("outfile.txt"); // Player1 user = new Player1(); ArrayListlistOfPlayers = new ArrayList(); Player1 user = new Player1(); // Tokenizing System.out.println("CSCI213 Players Management System"); while(input.hasNextLine()){ System.out.println("\nPlayer " + num); data = input.nextLine(); StringTokenizer token = new StringTokenizer(data,"|"); // int t = token.countTokens(); // System.out.println("t is:" + t); first = token.nextToken().trim(); user.setLoginname(first); second = new String(token.nextToken("|")); user.setPassword(second); third = new String(token.nextToken("|")); user.setChips(third); fourth = new String(token.nextToken("|")); user.setUsername(fourth); fifth = new String(token.nextToken("|")); user.setEmail(fifth); sixth = new String(token.nextToken("|")); user.setBirthdate(sixth); // user.display(); listOfPlayers.add(user); System.out.println("Size is: " + listOfPlayers.size()); // System.out.println(user.loginname); // System.out.println(listOfPlayers.get(num-1).loginname); num++; // output.write(data); // output.write("\r\n"); } int x = listOfPlayers.size(); System.out.println("Size is: " + x); System.out.println(listOfPlayers); // Display address of required Player1 p = new Player1(); for(int i = 0; i < x; i++){ p = listOfPlayers.get(i); System.out.println(p.loginname); } for(Player1 e:listOfPlayers){ System.out.println(e.loginname); System.out.println(e.email); } while(input.hasNextLine()){ data = input.nextLine(); output.write(data); output.write("\r\n"); } input.close(); output.close(); } } // Store all player information public class Player1 { static String loginname; static String password; static String chips; static String username; static String email; static String birthdate; /* public Player1(String loginname, String password, String username, String email, String birthdate){ this.loginname = loginname; this.password = password; this.username = username; this.email = email; this.birthdate = birthdate; } */ public Player1() { // TODO Auto-generated constructor stub } public static String getLoginname() { System.out.print("loginname: "); return loginname; } public static void setLoginname(String loginname) { Player1.loginname = loginname; } public static String getPassword() { System.out.print("password: "); return password; } public static void setPassword(String password) { Player1.password = password; } public static String getUsername() { System.out.print("username: "); return username; } public static void setUsername(String username) { Player1.username = username; } public static String getEmail() { System.out.print("email: "); return email; } public static void setEmail(String email) { Player1.email = email; } public static String getBirthdate() { System.out.print("birthdate: "); return birthdate; } public static void setBirthdate(String birthdate) { Player1.birthdate = birthdate; } public static String getChips() { System.out.print("chips: "); return chips; } public static void setChips(String chips) { Player1.chips = chips; } public void display() { System.out.println("Name: " + this.username); System.out.println("Email: " + this.email); System.out.println("Birthdate: " + this.birthdate); System.out.println("Login ID: " + this.loginname); System.out.println("Balance Chips: " + this.chips); } /* @Override public String toString() { return "toString()=" + this.loginname + "\n"; } */ } 

简单:

  Player1 user = new Player1(); 

您是一次又一次地添加相同的对象。 将该语句放入循环中。 您想在每次循环迭代期间添加一个全新的Playwer对象!

但即便如此,事情也不会成功; 因为(正如Eran所说):你的Player类只有静态字段。 那就像“作弊”; 因为这意味着所有Player对象也会看到相同的字段(因为静态字段在类的所有实例之间共享 !)

换句话说: 静态是良好的OO设计中的exception。 您不要将其用作默认值; 恰恰相反:你只在特殊的角落情况下使字段静止(参见这里的一些例子)。

你有两个错误:

  1. 您将一遍又一遍地将相同的Player1实例添加到列表中。 你应该移动Player1 user = new Player1(); 进入添加玩家的循环。

    更改

     Player1 user = new Player1(); // Tokenizing System.out.println("CSCI213 Players Management System"); while (input.hasNextLine()) { 

     // Tokenizing System.out.println("CSCI213 Players Management System"); while (input.hasNextLine()) { Player1 user = new Player1(); 
  2. Player1类的成员都是静态的,因此即使您修复了第一个问题, Player1所有实例都将共享这些成员。 您应该将它们更改为非静态。

    更改

     public class Player1 { static String loginname; static String password; static String chips; static String username; static String email; static String birthdate; 

     public class Player1 { String loginname; String password; String chips; String username; String email; String birthdate;