Java 基于用户输入创建多个对象
我正在尝试根据用户输入实例化多个对象。然而,我无法让它工作。有一个player类,其用户名使用getter和setter方法,但我似乎无法从我的条目中成功实例化该对象。这只是一些示例代码粘贴在我试图做的事情。我不想为此使用数据库,所以我只计划使用数组列表。播放器被封装在for循环中,当for循环退出时,创建的播放器对象将失效。我如何才能做到这一点,并允许输入的名称跨播放器类访问播放器类 代码更新:为Player类中的getName方法返回相同的值 提前谢谢Java 基于用户输入创建多个对象,java,Java,我正在尝试根据用户输入实例化多个对象。然而,我无法让它工作。有一个player类,其用户名使用getter和setter方法,但我似乎无法从我的条目中成功实例化该对象。这只是一些示例代码粘贴在我试图做的事情。我不想为此使用数据库,所以我只计划使用数组列表。播放器被封装在for循环中,当for循环退出时,创建的播放器对象将失效。我如何才能做到这一点,并允许输入的名称跨播放器类访问播放器类 代码更新:为Player类中的getName方法返回相同的值 提前谢谢 ArrayList<
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());
}
首先:
ArrayList<Player> players = new ArrayList<Player>();
arraylistplayers=newarraylist();
然后,在for循环中,您需要声明一个新的Player对象并将该Player添加到列表中。您现在要做的是将字符串名称添加到列表中,该列表不是播放器对象。您从未“创建”过这些对象。你所做的只是创建了一个数组来保存对玩家的引用,但是没有一个玩家是用“new”关键字创建的,这就是编译器分配必要的内存空间来保存它的信息,比如名称 在我看来,关于如何实现这一点的实际代码并不重要,您可能需要更新自己关于Java对象生命周期、构造函数等的知识。这应该是可行的
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);
}
arraylistplayers=newarraylist();
国际球员;
System.out.println(“这个游戏有多少玩家?”);
numOfPlayers=input.nextInt();
for(int i=0;i
现在所有玩家对象都可以从players
列表中访问
Player
类有一个static
变量name
-因为静态值不依赖于对象,并且对于类的所有对象都保持相同-您无法使用getName()
方法为不同的对象获取不同的名称。在Player plr=(Player)players.get(i)代码>您正试图从字符串对象强制转换播放器对象。除非您的Player类对Java的String类有某种类型的抽象,否则您不能隐式地从一个类转换到另一个类。换句话说,你不能说Player p=(String)s代码>或字符串s=(播放器)p代码>而不提供执行此操作的机制。相反,您需要使用new
操作符来实例化Player对象
您没有发布播放器对象的构造函数,但是如果它是未定义的或空的构造函数(意味着它不接受任何参数,如public Player(){}
),您可以使用new
操作符,如Player plr=new Player(),实例化该对象代码>。因为您可能希望确保播放机具有名称,因此更好的编码实践是向默认构造函数添加名称参数,如public player(String name){this.setName(name);}
,这将消除每次创建新对象时手动调用setName()
我还要指出的一点是,您的ArrayList的名称有误导性,因为它包含“名称”(或“玩家名称”)而不是“玩家”。我认为这可能是你困惑的一部分,因为你似乎希望从中得到一个播放器
对象,而不是字符串
。在处理容器时,可以使用它来消除一些模糊性。在您的情况下,声明ArrayList播放器可能是有益的代码>如果Player
对象是您打算存储在那里的对象或ArrayList playerNames代码>如果字符串对象是您要存储的对象。1。不要使用原始类型,2。如果players
包含字符串,则它不包含Player
您应该实例化一个Player(假设该对象存在),如Player=newplayer(arg1,arg2..)但是当我输入System.out.println(players.get(0.getName());&对第二个输入的名称执行此操作,它会将它们作为相同的名称返回?为什么使用moniker=pName代码>在Player
类setName
方法中?不应该是this.name=pName
而且Player
类中的name
属性是静态的-导致Player
类的所有对象的值相同。您完全正确。这已经消除了很多关于在类中使用静态的困惑。为了更清晰,请阅读这里:谢谢你的回答,这非常有帮助。如何使用此arraylist中的元素访问Player类中的getName方法?players.get(I).getName(),其中I是元素的索引谢谢。奇怪的是,它返回了所有值的最后一个输入值。我已经更新了代码,你知道为什么吗?它在哪里返回最后的输入值?我在那里的player类中添加了。它返回player类中的name属性
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);
}