我正在尝试根据用户输入获取多个对象进行实例化。但是,我无法让它发挥作用。有一个玩家类,其中包含用户名的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;
}
}
答案 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
对象而不是String
。 Generics 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()
方法的不同对象。