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