如何在Processing [Literally]中创建一个对象数组?

时间:2017-06-09 23:42:59

标签: java processing

我想知道如何将对象放在数组中,例如:

TreeObj[] trees = {new TreeObj(100,100), new TreeObj(50,50)};

第一个值是x,第二个值是y。我之前看过这个,但得到了这样的答案:

TreeObj[] trees = new TreeObj[2];

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);
  }
}