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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中怎么初始化对象数组?相关的知识,希望对你有一定的参考价值。

例如 有一个对象数组Animals [] an; 假如我在这个类的构造函数中定义了an=new Animals[5] 但是我只要加入3个 后面两位为空 或者是0 怎么实现? 求高手指点

你这个试试对对象数组的一个声明,并没有示例话,所以会报空指针异常
这个数组对象都是现用现初始化的
Animals [] an=new Animals[5];//这只是个对象类型数组的声明
用的时候需要
for(int i=0;i<5;i++)
an[i]=new Animals();
这样你明白了吧
你前面的那个光声明了数组,但是没有调用Animals的构造函数,你数组里的每个元素都是一个对象,使用前必须要先实例化
如果你只是用户输入长度,
Animals [] an=new Animals[n];
声明时是可以用变量的
或者你直接Animals [] an=new Animals[100];定义一个大数组,要用的时候再new Animals();实例化,或者用LinkedList<Animals> an=new LinkedList<Animals>();定义一个动态数组追问

多谢 解决了

参考技术A

初始化数组有三种方式,以下都是去初始化一个String类型长度2的数组:

方式一:

String[] strs = new String[2];
strs[0] = "0";
strs[1] = "1";

方式二:

String[] strs = new String[]"0", "1";

方式三:

String[] strs = "0", "1";

三种方式,都有自己的使用场景,在合适场景使用即可。

参考技术B stu=new Student[5];这条语句定义了含有5个Student对象的数组,但没有初始化,所以你要在类里面加一个无参的构造函数
Student()

Num = 0;
Name = NULL;
Sex = NULL;
M = 0;
C = 0;
D = 0;
参考技术C 定义并初始化方法一:
String[] a = new String[3];
a[0] = "a";
a[1] = "b";
a[2] = "c";

定义并初始化方法二:
String[] b = new String[]"a","b","c";
参考技术D 嗯,new之后只是分配了空间,如果不指定值,对象数组空间对应的就是空。那么如你所说,可否详尽一下错误呢?追问

报的是空指针异常, 就是我定义了一个Animals [] an数组 后来我定义了方法,向数组中加入元素。(元素是对象,一个Animal的集合) 加入这个数组的长度是3,但是我只向其中加入了2个元素,我定义一个方法去查看的时候就报出了空指针异常的错误。

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

【中文标题】如何在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相关。怎么删除对象数组中的一个元素??谢谢

jniC++怎么返回java的对象数组

可变数组怎么初始化(可变大小的对象不能被初始化)?

java中如何初始化对象数组,并增加元素

java 怎样传递数组对象