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


79

我想初始化一个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应该编译。
Bala R

Answers:


98

差不多了 只需:

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

并让循环成为:

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

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

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


1
不知道你的意思在这里。我在类Player中有构造函数。您是否也将InitializePlayers放在Player类中?
约翰·亚当斯

1
@John Galt是的。它不能在课堂之外
博佐

@Powerlord尽管它可能包含被广泛使用的约定并提供了很好的建议,但我敢肯定,该文档中的一半内容太晦涩难懂,以至于不能真正视为约定。
twiz 2013年

@twiz公平地说,该文档是OraclenéeSun有其自己的开发人员使用的编程约定。我没有通过代码OpenJDK的去看看如何以及他们遵守。
Powerlord

1
Java编程语言的@Powerlord代码约定是新的(旧的)主页。

23

代替

Player[PlayerCount] thePlayers;

你要

Player[] thePlayers = new Player[PlayerCount];

for(int i = 0; i < PlayerCount ; i++)
{
    thePlayers[i] = new Player(i);
}
return thePlayers;

应该返回用Player实例初始化的数组。

编辑:

在Wikipedia上查看有关广泛使用的Java命名约定的表格


当您重新初始化thePlayers数组时,此创建内存不会泄漏吗?

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

1
我更喜欢List<Player> thePlayersList = new ArrayList<Player>();
Deqing

2
@Deqing那样的话我更喜欢Object thePlayersList = new ArrayList<Player>();
JoelSjögren2014年

@Deqing在超载的情况下,运行方式实际上会有所不同。
Neel 2016年

9

如果可以硬编码播放器数量

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

1

初始化后,数组不可更改。您必须给它一个值,而该值就是数组长度保持的值。您可以创建多个数组来包含玩家信息的某些部分(例如手牌等),然后创建一个arrayList来排列这些数组。

我看到的另一个争论点是,您的私有Player [] InitializePlayers()是静态的,而该类现在是非静态的,我对此可能是错的。所以:

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

我的最后一点是,您可能应该在要更改它的方法之外声明playerCount,以便设置为它的值也变为新值,而不仅仅是在方法结束时扔掉“范围。”

希望这可以帮助


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

0

thePlayers[i] = new Player(i); 我只是删除了i里面Player(i); 而且有效。

因此代码行应为:

thePlayers[i] = new Player9();

我认为这是因为他定义玩家的方式,public Player(int i)因此最初应该输入一个整数。
dexhunter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.