为什么在这个 Java 程序中 Player 对象的第二个实例重写了第一个实例?

问题描述 投票:0回答:1

我正在尝试编写一个程序,允许用户输入“Player”对象的四个特征,并将该对象添加到其他 Player 对象的数组列表中。然而,似乎所有 Player 对象都被视为相同。

我怀疑程序正在做的所有事情都是用对具有相同实例变量的同一对象的许多引用来填充数组列表,但我无法找到一种方法来用具有不同实例变量的离散对象填充数组列表。

驱动程序类代码

package playerdatamanager;

import java.util.*;

public class MainMenu {

    public static void main(String[] args) {
        
        ArrayList<Player> playerRoster = new ArrayList<>();

        Scanner input = new Scanner(System.in);

        int exitMenu = 0;

        while (!"7".equals(exitMenu)) {

            System.out.println("Please choose an option or press 7 to exit [1-7].");
            System.out.println("1. " + "Add a player");
            System.out.println("2. " + "Update a player");
            System.out.println("3. " + "Delete a player");
            System.out.println("4. " + "List all players");
            System.out.println("5. " + "Calculate the average BMIs for the players");
            System.out.println("6. " + "Display the details of the tallest player");
            System.out.println("7. " + "Exit");

            int menuOption = Integer.parseInt(input.nextLine());

            

            switch (menuOption) {
                case (1):

                    System.out.println("Please enter the name of the player.");

                    String newPlayerName = input.nextLine();

                    System.out.println("Please enter the jersey number of the player.");

                    int newPlayerJerseyNumber = Integer.parseInt(input.nextLine());

                    System.out.println("Please enter the height of the player.");

                    double newPlayerHeight = Double.parseDouble(input.nextLine());

                    System.out.println("Please enter the weight of the player.");

                    double newPlayerWeight = Double.parseDouble(input.nextLine());

                    playerRoster.add(new Player(newPlayerName, newPlayerJerseyNumber, newPlayerHeight, newPlayerWeight));

                    break;

                case (2):
                    System.out.println("Which player would you like to update?");

                    System.out.println(playerRoster.toString());

                    int playerIndex = Integer.parseInt(input.nextLine());

                    System.out.println("Selected" + playerRoster.get(playerIndex).toString());

                    System.out.println("Enter the value you would like to change[1. name ,2. jersey number,3. weight,4. height]");

                    int userValueUpdate = Integer.parseInt(input.nextLine());

                    switch (userValueUpdate) {

                        case (1):
                            System.out.println("Please enter the new value for the player's name.");

                            Player.setName(input.nextLine());

                            break;

                        case (2):
                            System.out.println("Please enter the new value for the player's jersey number.");

                            Player.setJerseyNumber(Integer.parseInt(input.nextLine()));

                            break;

                        case (3):

                            System.out.println("Please enter the new value for the player's weight.");

                            Player.setWeightInPounds(Double.parseDouble(input.nextLine()));

                            break;

                        case (4):
                            System.out.println("Please enter the new value for the player's height.");

                            Player.setHeightInInches(Double.parseDouble(input.nextLine()));

                            break;
                    }

                    break;
                case (3):

                    System.out.println("Which player would you like to delete?");

                    int userDeletion = Integer.parseInt(input.nextLine());

                    playerRoster.toString();

                    playerRoster.remove(userDeletion);

                    break;

                case (4):

                for (int i = 0; i < playerRoster.size();i++) {
                    
                    
                    
                    
                   
                    
                    
                    System.out.print("Name: " + playerRoster.get(i).getName() + "\nHeight: " + Double.toString(playerRoster.get(i).getHeight()) + "\nWeight: " + Double.toString(playerRoster.get(i).getWeight()) + "\nJersey Number: " + Integer.toString( playerRoster.get(i).getJerseyNumber()) + "\n\n");
                }

                    break;



            }
        } 
    }
}

玩家类别代码

package playerdatamanager;

/**
 *
 * @author Austin
 */
public class Player {

    private static String name;
    private static int jerseyNumber;
    private static double height;
    private static double weight;

    /**
     * The default constructor for the Player object.
     */
    public Player() {
    }

    /**
     * Overloaded constructor to initialize Player object with user values.
     *
     * @param name The name of the Player
     * @param jerseyNumber The Jersey Number of the Player
     * @param height The height of the Player
     * @param weight
     */
    public Player(String name, int jerseyNumber, double height, double weight) {
        this.name = name;
        this.jerseyNumber = jerseyNumber;
        this.height = height;
        this.weight = weight;
    }

    /**
     * method to calculate the BMI of a given player.
     *
     * @param height The height of a player.
     * @param weight The weight of a player.
     * @return the BMI of a player.
     */
    /**
     * setter method to set the player's name.
     *
     * @param userName The name given by the user.
     */
    public static void setName(String userName) {
        name = userName;
    }

    /**
     * setter method to set a player's jersey number.
     *
     * @param userJerseyNumber The jersey number given by the user.
     */
    public static void setJerseyNumber(int userJerseyNumber) {
        jerseyNumber = userJerseyNumber;
    }

    /**
     * setter method to set a player's height in inches.
     *
     * @param userHeight The height in inches given by the user.
     */
    public static void setHeightInInches(double userHeight) {
        height = userHeight;
    }

    /**
     * setter method to set a player's weight in pounds.
     *
     * @param userWeight The weight in pounds given by the user.
     */
    public static void setWeightInPounds(double userWeight) {
        weight = userWeight;
    }

    /**
     * getter method to retrieve the name of a player.
     *
     * @return The player's name.
     */
    public static String getName() {
        return name;
    }

    /**
     * getter method to retrieve the jersey number of a player.
     *
     * @return The player's jersey number.
     */
    public static int getJerseyNumber() {
        return jerseyNumber;
    }

    /**
     * getter method to retrieve the weight in pounds of a player.
     *
     * @return The player's weight in pounds.
     */
    public static double getWeight() {
        return weight;
    }

    /**
     * getter method to retrieve the height in inches of a player.
     *
     * @return The player's height in inches.
     */
    public static double getHeight() {
        return height;
    }

    public static double BMICalculation() {
        double BMI;

        BMI = 703 * (getWeight() / (getHeight() * getHeight()));

        return BMI;
    }

    public static void playerRosterToString(double height, double weight, int jerseyNumber, String name) {

        String playerStats = "Name: " + name + "\nHeight: " + Double.toString(height) + "\nWeight: " + Double.toString(weight) + "\nJersey Number: " + Integer.toString(jerseyNumber);

        System.out.print(playerStats);

    }

}

用户应该能够输入球员的姓名、球衣号码、体重和身高。那么用户应该能够随时阅读它。

但是,如果用户输入球员姓名“Babe Ruth”、球衣号码 1、体重 155 和身高 70,这些信息将被存储。然后,如果用户输入球员姓名“Joe Dimaggio”、球衣号码 2、体重 170 和身高 75,程序不会存储 Joe Dimaggio 的任何信息,但会存储 Babe Ruth 的属性。

如果用户列出所有玩家,则输出为:

姓名:贝比·鲁斯

球衣号码:1

重量:155

身高:70

姓名:贝比·鲁斯

球衣号码:1

重量:155

身高:70

当它应该是:

姓名:贝比·鲁斯

球衣号码:1

重量:155

身高:70

姓名:乔·迪马吉奥

球衣号码:2

重量:170

身高:75

java class object arraylist constructor
1个回答
0
投票

你正在做某件事!

但是,您并没有一遍又一遍地引用相同的

Player
。 相反,你确实有不同的
Player
对象,但肯定有一些事情正在发生......

看看你的

setX
方法。哪些字段正在更新? 这是玩家的名字:
private static String name;

回忆;

static
表示该字段不是特定于某个
Player
,而是针对“所有”
Player
对象。

因此,当您使用

set
-方法构造新的
Player
-对象时,您正在重新分配这些
static
-字段。因此,为什么所有
Player
对象似乎都具有相同的字段值。

解决方案

字段不应该是

static
- 除非您希望所有
Player
-对象具有相同的字段值。

© www.soinside.com 2019 - 2024. All rights reserved.