我想知道如何将对象放在数组中,例如:
TreeObj[] trees = {new TreeObj(100,100), new TreeObj(50,50)};
第一个值是x,第二个值是y。我之前看过这个,但得到了这样的答案:
TreeObj[] trees = new TreeObj[2];
答案 0 :(得分:0)
对象数组的工作方式与任何数组相同。两种方式都很完美,这取决于你想做什么。第一种方式是某种意义上的“快捷方式”创建并初始化数组。第二种方法是在堆内存中创建空间,然后你必须做类似的事情:
trees[0] = new TreeObj(100,100);
trees[1] = new TreeObj(50,50);
我认为第一种方式主要用于当你只有有限的值,例如有限的移动,你可能想要循环而不会修改:
int[][] moves = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} }; //creates 4 x 2 array
而第二种方式通常使用循环初始化。一个例子是创建一个玩家可以继续前进的地图。您可能需要一张100 x 100的地图。然后你选择先填充字符,比如''。然后当玩家移动时,角色会变为'。'。显然,你不会硬编码整个事情,所以你做了类似的事情:
char[][] map= new char[100][100]; //creates 100 x 100 array
for(int i = 0; i < map.length; i++){
for(int j = 0; i < map[i].length; j++){
map[i][j] = ' '; //initialization of array, changing default
}
}
Object数组只是改变了数组的类型。因此,您有一个TreeObj数组而不是int或char。请注意,通过使用第二种方法,数组被初始化为其默认值,因此对于int,它将满0并且对于包装器/对象,它将充满空值(我意识到我使用2D数组作为我的示例。逻辑/ concept也适用于1D数组)。所以,总之,它实际上取决于你打算如何使用阵列!
答案 1 :(得分:0)
这两个选项都有效。
选项一是一次性实例化对象,这一点不那么冗长,但是不允许你轻松地将动态参数传递给构造函数:
TreeObj[] trees = {new TreeObj(100,100), new TreeObj(50,50)};
void setup(){
for(TreeObj t : trees) t.draw();
}
class TreeObj{
int x,y;
TreeObj(int x,int y){
println(x,y);
this.x = x;
this.y = y;
}
void draw(){
ellipse(x,y,20,20);
}
}
选项二使用该类类型创建该长度的数组,但是该数组将包含两个null
值,直到您使用该类的新实例初始化每个值,但您可以将动态参数传递给构造函数:
TreeObj[] trees = new TreeObj[2];
void setup(){
print("trees[] before instantiation: ");
println(trees);
for(int i = 0 ; i < trees.length; i++){
trees[i] = new TreeObj(width/(i+1),height/(i+1));
trees[i].draw();
}
print("trees[] after instantiation: ");
println(trees);
}
class TreeObj{
int x,y;
TreeObj(int x,int y){
println(x,y);
this.x = x;
this.y = y;
}
void draw(){
ellipse(x,y,20,20);
}
}