【问题标题】:How to initialize an array of objects in Java如何在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 的东西应该可以编译。

标签: java arrays object initialization


【解决方案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)的方式所以最初应该采用整数输入。
        猜你喜欢
        • 2013-10-12
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 2018-02-26
        • 2022-08-12
        相关资源
        最近更新 更多