【问题标题】:Array of objects of different types不同类型的对象数组
【发布时间】:2013-08-18 21:46:09
【问题描述】:

我正在将游戏编程为 Java 小程序,并且我有两个具有相似变量的不同类 - PavementWay

我想创建一个包含两个类的对象的数组。例如,我必须更改所有这些对象的xy,所以我想创建一个Array。这可以吗?

我尝试过ArrayList<Object> obj = new ArrayList<Object>();,但如果我obj.add(0, theWay); 我找不到读取变量的方法。

我也试过System.out.print(obj.get(0));,得到了rpg.way@2c61bbb7

【问题讨论】:

  • 您使用的是ArrayList,而不是数组。 PavementWay 的类看起来如何?请将他们的代码添加到您的问题中。

标签: java arrays class object types


【解决方案1】:

简而言之,您想在 Way 实例或 Pavement 实例上调用方法(如 setX()),而不知道对象是 Way 还是 Pavement。

这正是多态性解决的问题。定义一个接口Locatable,并让你的两个类实现这个接口。然后创建一个List<Locatable>,您就可以在其中添加 Ways 和 Pavements:

public interface Locatable {
    public void setX(int x);
    public void setY(int y);

    public int getX();
    public int getY();
}

public class Way implements Locatable {
    ...
}

public class Pavement implements Locatable {
    ...
}

List<Locatable> locatables = new ArrayList<Locatable>();
list.add(new Way());
list.add(new Pavement());
for (Locatable locatable: locatables) {
    locatable.setX(22);
    locatable.setY(43);
}

for (Locatable locatable: locatables) {
    System.out.println("the locatable is an instance of " + locatable.getClass());
    System.out.println("its location is " + locatable.getX() + ", " + locatable.getY());

}

【讨论】:

    【解决方案2】:

    您可以使用ArrayList&lt;Object&gt; 并检查对象的类型。

    例如:

    ArrayList<Object> L = new ArrayList<Object>();
    //..add objects
    for (Object o : L){
        if(o.getClass() == Class1.class){
            Class1 obj1 = (Class1) o;
            //...
        }else if(o.getClass() == Class2.class){
            Class2 obj2 = (Class2) o;
            //...
        }else{
            //...
        }
    }
    

    您也可以使用instanceof 来检查类型。

    【讨论】:

    • 好吧,我不是那个意思。例如,我想将 10 个道路对象和 10 个路面对象放入一个数组中,以访问 x 和 y 变量。你能帮我吗?
    【解决方案3】:

    您提到课程不同但相似?如果类足够相似以至于您想尝试在类上调用相同的方法,您可能需要考虑使用抽象类来概括类:这比“实例”和种姓解决方案要好得多。您也可以使用接口,但如果它们以相同的方式工作,抽象类允许您实际实现 changeX() 和 changeY()。例如,如果您想对其中任何一个对象调用 changeX(int x) 或 changeY(int y),无论它们是 Way 还是 Pavement 对象,您可能需要执行以下操作:

    public abstract class Changeable
    {
        public void changeX(int x) {
            this.x = x;
        }
        public void changeY(int y) {
            this.y = y;
        }
    
        protected int x;
        protected int y;
    }
    
    public Class Pavement extends Changeable{ ... }
    
    public Class Way extends Changeable{ ... }
    

    此时您可以创建接口数组并在其中插入对象,如下所示:

    List<Changeable> paths = new ArrayList<Changeable>();
    paths.add(new Way());
    paths.add(new Pavement());
    Changeable path = paths.get(0);
    path.changeX(5);
    path.changeY(7);
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2016-05-25
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多