gpt4 book ai didi

java - 如何动态创建对象以添加到 Java 中的 ArrayList

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:20 24 4
gpt4 key购买 nike

我目前正在使用 Java 和代号 One 构建一个 2D 小行星游戏,主要关注 OOP 模式。但是,我在尝试动态创建新对象(在我的例子中,我要添加的对象是父类(super class) GameObject)以添加到 ArrayList 时遇到了麻烦。正如您在 GameWorld.java 的 void init() 方法中看到的那样,我创建了一个包含 GameObject 类型的列表,其中包括 Asteroids、Ships、Spacestations 的子类。

程序要求类中的命令键盘输入,例如“a”,然后应该将新的 Asteroid(GameObject 的子类)对象添加到 ArrayList 中。用户应该能够添加他们想要分配给 ArrayList 的尽可能多的小行星。

我的问题是:如何声明一个名为 AsteroidTest 的 Asteroid 类型的变量,就像我目前在我的游戏世界类的 addAsteroid() 函数?谢谢!

GameWorld.java

package com.mycompany.a1;

import java.util.ArrayList; //For ArrayList Usage

public class GameWorld {

public void init() {
ArrayList<GameObject> list = new ArrayList<GameObject>();
}
//other methods here to manipulate Game objects and data
public void addShip() {
Ship ShipTest = new Ship();

list.add(ShipTest);

System.out.println(ShipTest.getLocation());
}

public void addAsteroid(){
Asteroid AsteroidTest = new Asteroid();

list.add(AsteroidTest);


System.out.println(AsteroidTest.getLocation());
}


public void addSpaceStation(){

}
}

游戏.java

package com.mycompany.a1;

import com.codename1.ui.events.ActionListener;
import com.codename1.ui.Label;
import com.codename1.ui.TextField;
import com.codename1.ui.events.ActionEvent;
import java.lang.String;
import com.codename1.ui.Form;

public class Game extends Form{
private GameWorld gw;

public Game (){
gw = new GameWorld();
gw.init();
play();

}

private void play(){

Label myLabel=new Label("Enter a Command:"); this.addComponent(myLabel);
final TextField myTextField=new TextField();
this.addComponent(myTextField);
this.show();
myTextField.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
String sCommand=myTextField.getText().toString();
myTextField.clear();
switch (sCommand.charAt(0)){
case 's':
gw.addShip();
break;
case 'a':
gw.addAsteroid();
break;
case 'b':
gw.addSpaceStation();
break;
//add code to handle rest of the commands
} //switch
} //actionPerformed
} //new ActionListener()
); //addActionListener
} //play
//code to enter text field and receive keyboard input
}

GameObject.java 父类(super class)。子类包括小行星、船舶、导弹、空间站

package com.mycompany.a1;

public abstract class GameObject {
private double x;
private double y;

public GameObject(){
x = 0;
y = 0;
}

public double getX(){
return x;
}

public void setX(double newX){
x = newX;
}

public double getY(){
return y;
}

public void setY(double newY){
y = newY;
}

public String getLocation(){
return "(" + x + ", " + y + ")";

}
}

Asteroid.java

 package com.mycompany.a1;

import java.util.Random;

public class Asteroid extends MovableObject {

private Random rand = new Random();


public Asteroid() {
setX(rand.nextInt(1023) + rand.nextDouble());

setY(rand.nextInt(767) + rand.nextDouble());// TODO Auto-generated
constructor stub
}

}

最佳答案

很简单:

public void addAsteroid(){
this.list.add(new Asteroid());
}

但是如果你想打印位置,你必须在创建新的小行星时这样做,所以在构造函数中:

public GameObject(){
x = 0;
y = 0;
System.out.println("(" + x + ", " + y + ")");
}

另外:

  • 声明ArrayList<GameObject> list作为List<GameObject>使用抽象而非具体实现
  • 声明List<GameObject> list作为 GameWorld 类中的私有(private)字段
  • 考虑使用构造函数而不是 public void init()
  • 如果出现并发问题,请使用 java.util.concurrent.CopyOnWriteArrayList<E>而不是传统的列表
  • 考虑在 GameObject 中使用第二个构造函数来处理具有初始坐标的对象的创建 + 删除 setX 和 setY 方法 + 引入 moveTo(double x, double y)方法更明确的意图

关于java - 如何动态创建对象以添加到 Java 中的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com