根据用户输入创建多个对象

时间:2014-03-11 19:55:34

标签: java

我正在尝试根据用户输入获取多个对象进行实例化。但是,我无法让它发挥作用。有一个玩家类,其中包含用户名的getter和setter方法,但我似乎无法从我的条目中成功实例化该对象。这只是一些示例代码粘贴在我想要做的事情上。我不想为此使用数据库,所以我只打算使用数组列表。 Player被封装在for循环中,当for循环退出时,创建的player对象已经死了。如何使这项工作成功并允许插入的名称在整个播放器类中访问Player类?

CODE UPDATES:为Player类

中的getName方法返回相同的值

提前致谢

      ArrayList<Player> players = new ArrayList<Player>();
    int numOfPlayers;

    System.out.println("How many players are in this game?");
    numOfPlayers = input.nextInt();


    for(int i = 0; i < numOfPlayers; i++)
    {
        System.out.print("What is Player " + (i + 1) + " name?");
        String name = input.next();
        Player plr = new Player(); // assuming you have a default constructor
        plr.setName(name);
        players.add(plr);
    }

    for(int i = 0; i < numOfPlayers; i++)
    {
        System.out.println(players.get(i).getName());
    }

玩家类

public class Player
{

    private static String name;

    public void setName(String pName)
    {
        name = pName;
    }

    public String getName()
    {

        return name;
    }
}

4 个答案:

答案 0 :(得分:1)

首先:

ArrayList<Player> players = new ArrayList<Player>();

然后,在for循环中,您需要声明一个新的Player对象并将该Player添加到列表中。你现在正在做的是在列表中添加String name,这不是Player对象。

答案 1 :(得分:1)

在行Player plr = (Player)players.get(i);中,您试图从String对象中强制转换Player对象。除非你的Player类对Java的String类有某种抽象类型,否则你不能隐式地从一个类转换到另一个类。换句话说,如果没有提供这样做的机制,就不能说Player p = (String) s;String s = (Player) p;。相反,您将要使用new运算符来实例化Player对象。

您没有为您的Player对象发布构造函数,但是如果它是一个未定义或空的构造函数(意味着它没有采用任何参数,如public Player () {})您可以使用像new这样的Player plr = new Player();运算符来实例化对象。因为您可能希望确保您的播放器具有名称,所以更好的编码方法是将名称参数添加到默认构造函数,如public Player(String name){this.setName(name);},这样就无需在每次创建时手动调用setName()一个新的对象。

我想指出的另一件事是你的ArrayList被误导地命名,因为它包含&#34; names&#34; (或者#34;球员姓名&#34;)而不是&#34;球员&#34;。我认为这可能是您混淆的一部分,因为您似乎希望从中获取Player对象而不是StringGenerics are a good Java construct在处理容器时可以用来消除这种歧义。在您的情况下,如果ArrayList<Player> players;对象是您打算存储在那里的对象,则声明Player可能是有益的,如果ArrayList<String> playerNames;对象是您要存储的对象,则String。< / p>

答案 2 :(得分:0)

您从未“创建”过这些对象。您所做的只是创建了一个数组来保存对玩家的引用,但是没有玩家使用'new'关键字创建,并且步骤编译器会分配必要的内存空间来保存它的信息,例如名称。

在我看来,关于如何做到这一点的实际代码并不重要,您可能想要了解Java对象生命周期,构造函数等。

答案 3 :(得分:0)

这应该有效

ArrayList<Player> players = new ArrayList<Player>();
int numOfPlayers;

System.out.println("How many players are in this game?");
numOfPlayers = input.nextInt();


for(int i = 0; i < numOfPlayers; i++)
{
    System.out.print("What is Player " + (i + 1) + " name?");
    String name = input.next();
    Player plr = new Player();
    plr.setName(name);
    players.add(plr);
}

现在可以从players列表中访问所有玩家对象。

Player类有static变量name - 因为静态值不依赖于对象,并且对于类的所有对象保持相同 - 您无法获得不同的名称使用getName()方法的不同对象。