如何在Java中初始化对象数组

时间:2011-05-04 19:46:44

标签: java arrays object initialization

我想为BlackJack游戏初始化一个Player对象数组。我已经阅读了很多关于初始化原始对象的各种方法,比如一个int数组或一个字符串数组但是我不能把这个概念带到我想要做的事情(见下文)。我想返回一个初始化的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  

7 个答案:

答案 0 :(得分:89)

几乎没问题。只是:

Player[] thePlayers = new Player[playerCount + 1];

让循环成为:

for(int i = 0; i < thePlayers.length; i++)

请注意,java约定规定方法和变量的名称应以小写字母开头。

更新:将您的方法放在类体中。

答案 1 :(得分:20)

而不是

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的命名约定。

答案 2 :(得分:14)

如果您不确定数组的大小或是否可以更改,您可以执行此操作以获得静态数组。

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();

答案 3 :(得分:9)

如果您可以对玩家数量进行硬编码

Player[] thePlayers = {
    new Player(0),
    new Player(1),
    new Player(2),
    new Player(3)
};

答案 4 :(得分:1)

初始化后阵列不可更改。你必须给它一个值,该值就是该数组长度所保留的值。您可以创建多个数组来包含玩家信息的某些部分,比如他们的手等等,然后创建一个arrayList来对这些数组进行排序。

我看到的另一个争论点,我可能错了,事实是你的私有Player [] InitializePlayers()是静态的,其中类现在是非静态的。所以:

private Player[] InitializePlayers(int playerCount)
{
 ...
}

我的最后一点是你可能应该在方法之外声明playerCount来改变它,以便设置为它的值也成为新值,并且它不会被抛弃在最后该方法的“范围”。

希望这有帮助

答案 5 :(得分:1)

Player[] players = Stream.iterate(0, x-> x+1 ).limit(PlayerCount).map(i -> new Player(i)).toArray(Player[]::new);

答案 6 :(得分:0)

thePlayers[i] = new Player(i);我刚刚删除i内的Player(i);它起作用了。

所以代码行应该是:

thePlayers[i] = new Player9();