如何在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&lt;Player&gt; thePlayersList = new ArrayList&lt;Player&gt;(); @Deqing 这样的话我更喜欢Object thePlayersList = new ArrayList&lt;Player&gt;(); @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中初始化一个对象数组的主要内容,如果未能解决你的问题,请参考以下文章

java 中返回对象数组(急!!)

java 怎样传递数组对象

java 返回数组对象怎么返回

java中遇到对象数组参数的方法如何反射

您好,请问java中tostring方法如何输出对象数组??

JAVA中怎么初始化对象数组?