如何在Java中初始化一个对象数组
Posted
技术标签:
【中文标题】如何在Java中初始化一个对象数组【英文标题】:How to initialize an array of objects in Java 【发布时间】:2011-08-18 20:14:41 【问题描述】:我想为 BlackJack 游戏初始化一组 Player 对象。我已经阅读了很多关于初始化原始对象(如整数数组或字符串数组)的各种方法,但我无法将这个概念理解为我在这里尝试做的事情(见下文)。我想返回一组初始化的 Player 对象。要创建的玩家对象的数量是我提示用户的整数。我在想构造函数可以接受一个整数值并在初始化 Player 对象的一些成员变量时相应地命名播放器。我想我很接近但仍然很困惑。
static class Player
private String Name;
private int handValue;
private boolean BlackJack;
private TheCard[] Hand;
public Player(int i)
if (i == 0)
this.Name = "Dealer";
else
this.Name = "Player_" + String.valueOf(i);
this.handValue = 0;
this.BlackJack = false;
this.Hand = new TheCard[2];
private static Player[] InitializePlayers(int PlayerCount)
//The line below never completes after applying the suggested change
Player[PlayerCount] thePlayers;
for(int i = 0; i < PlayerCount + 1; i++)
thePlayers[i] = new Player(i);
return thePlayers;
编辑 - 更新: 这是我理解您的建议后更改后得到的结果:
Thread [main] (Suspended)
ClassNotFoundException(Throwable).<init>(String, Throwable) line: 217
ClassNotFoundException(Exception).<init>(String, Throwable) line: not available
ClassNotFoundException.<init>(String) line: not available
URLClassLoader$1.run() line: not available
AccessController.doPrivileged(PrivilegedExceptionAction<T>, AccessControlContext) line: not available [native method]
Launcher$ExtClassLoader(URLClassLoader).findClass(String) line: not available
Launcher$ExtClassLoader.findClass(String) line: not available
Launcher$ExtClassLoader(ClassLoader).loadClass(String, boolean) line: not available
Launcher$AppClassLoader(ClassLoader).loadClass(String, boolean) line: not available
Launcher$AppClassLoader.loadClass(String, boolean) line: not available
Launcher$AppClassLoader(ClassLoader).loadClass(String) line: not available
BlackJackCardGame.InitializePlayers(int) line: 30
BlackJackCardGame.main(String[]) line: 249
【问题讨论】:
Player
类是静态的有什么原因吗?您可以尝试从中删除static
关键字吗?
OK - 我尝试删除“静态”并且编译器标记以下内容:thePlayers[i] = new Player(i);
类似pastie.org/1865618 的东西应该可以编译。
tutorialcup.com/java/arrays-in-java.htm
【参考方案1】:
几乎没问题。只要有:
Player[] thePlayers = new Player[playerCount + 1];
让循环成为:
for(int i = 0; i < thePlayers.length; i++)
请注意,java 约定规定方法和变量的名称应以小写开头。
更新:将您的方法放在类主体中。
【讨论】:
不确定您的意思。我在 Player 类中有构造函数。你的意思是把 InitializePlayers 也放在 Player 类里面吗? @John Galt 是的。它不能在课堂之外 @Powerlord 虽然它可能包含广泛使用的约定并提供了很好的建议,但我很确定该文档中的一半项目都太晦涩难懂,实际上无法被视为约定。 @twiz 公平地说,该文档是 Oracle nee Sun 拥有自己的开发人员使用的编程约定。我还没有将代码浏览到 OpenJDK 以查看它们被遵循的程度以及。 @Powerlord Code Conventions for the Java Programming Language 是新(旧)家。【参考方案2】:代替
Player[PlayerCount] thePlayers;
你想要的
Player[] thePlayers = new Player[PlayerCount];
和
for(int i = 0; i < PlayerCount ; i++)
thePlayers[i] = new Player(i);
return thePlayers;
应该返回用 Player 实例初始化的数组。
编辑:
请查看this table on wikipedia,了解广泛使用的 java 命名约定。
【讨论】:
当你重新初始化 thePlayers 数组是循环时,这不会造成内存泄漏吗?【参考方案3】:如果您不确定数组的大小或者它是否可以更改,您可以这样做以获得静态数组。
ArrayList<Player> thePlayersList = new ArrayList<Player>();
thePlayersList.add(new Player(1));
thePlayersList.add(new Player(2));
.
.
//Some code here that changes the number of players e.g
Players[] thePlayers = thePlayersList.toArray();
【讨论】:
我更喜欢List<Player> thePlayersList = new ArrayList<Player>();
@Deqing 这样的话我更喜欢Object thePlayersList = new ArrayList<Player>();
。
@Deqing 在重载的情况下实际运行会有所不同。【参考方案4】:
如果你可以硬编码玩家人数
Player[] thePlayers =
new Player(0),
new Player(1),
new Player(2),
new Player(3)
;
【讨论】:
【参考方案5】:初始化后数组不可更改。你必须给它一个值,这个值就是数组长度所保留的值。您可以创建多个数组来包含玩家信息的某些部分,例如他们的手等,然后创建一个 arrayList 来对这些数组进行排序。
我看到的另一个争论点是,你的私有 Player[] InitializePlayers() 是静态的,而类现在是非静态的。所以:
private Player[] InitializePlayers(int playerCount)
...
我的最后一点是,您可能应该在将要更改它的方法之外声明 playerCount,以便设置给它的值也成为新值,而不是最后被丢弃方法的“范围”。
希望对你有帮助
【讨论】:
【参考方案6】:Player[] players = Stream.iterate(0, x-> x+1 ).limit(PlayerCount).map(i -> new Player(i)).toArray(Player[]::new);
【讨论】:
【参考方案7】:thePlayers[i] = new Player(i);
我刚刚删除了Player(i)
里面的i
;并且成功了。
所以代码行应该是:
thePlayers[i] = new Player9();
【讨论】:
我认为是因为他定义播放器public Player(int i)
的方式所以最初应该采用整数输入。以上是关于如何在Java中初始化一个对象数组的主要内容,如果未能解决你的问题,请参考以下文章