Java:当涉及父/子时,如何在ArrayList中获取值?

时间:2013-10-04 07:43:43

标签: java object arraylist parent-child

所以我有一个对象的ArrayList。在这些对象中有各种属性及其值。

代码非常简单。 GBox和GCircle是GHP的孩子。 ArrayList在World。

我想要做的是打印HP和盒子的体积以及HP和圆的直径。我知道我可以覆盖toString()但我实际上想要获取值。这样做的正确语法是什么?

//Main.java
public class Main {
    public static void main(String[] args) {
        Ini i = new Ini();
    }
}

//Ini.java
public class Ini {
    private static World w;

    public Ini() {
        w = new World;
        w.makeGBox();
        w.makeGCircle();
        System.out.println("Box: HP: " +
                           w.getList().get(0).getHP() +
                           "Volume: " +
                           w.getList().get(0).GBox.getVolume());
                           //compile error no variable GBox in GHP
        System.out.println("Circle: HP: " +
                           w.getList().get(1).getHP() +
                           "Radius: " +
                           w.getList().get(1).GCircle.getRadius());
                           //compile error no variable GCircle in GHP
    }
}

//World.java
import java.util.ArrayList;

public class World {
    private ArrayList<GHP> list = new ArrayList<>();

    public void makeGBox() {
        list.add(new GBox());
    }
    public void makeGCircle() {
        list.add(new GCircle());
    }

    public ArrayList<GHP> getList() {
        return list;
    }
}

//GHP.java
public class GHP {
    private int HP;

    public GHP() {
        setHP(5);
    }

    public int getHP() {
        return HP;
    }
    public void setHP(int HP) {
        this.HP = HP;
    }
}

//GBox.java
public class GBox extends GHP{
    private int volume;

    public GBox() {
        setVolume(10);
    }

    public int getVolume() {
        return volume;
    }
    public void setVolume(int volume) {
        this.volume = volume;
    }
}

//GCircle.java
public class GCircle extends GHP{
    private int radius;

    public GCircle {
        setRadius(7);
    }

    public int getRadius() {
        return radius;
    }
    public void setRadius(int radius) {
        this.radius = radius;
    }
}

5 个答案:

答案 0 :(得分:1)

除了许多编译问题外,您还需要进行这些更改才能实现您的目标。

for (GHP ghp : w.getList()) { // Avoid using get(index) without a forloop, as such
    if (ghp instanceof GBox) { // Using the instanceof operator, you can differentiate the 2 class types
        System.out.println("Box: HP: " + ghp.getHP() + "Volume: "
                + ((GBox) ghp).getVolume()); // Cast it to GBox to be able to call getVolume
    }

    if (ghp instanceof GCircle) {
        System.out.println("Circle: HP: " + ghp.getHP() + "Radius: "
                + ((GCircle) ghp).getRadius());// Cast it to GCircle to be able to call getRadius 
    }
}

答案 1 :(得分:0)

您需要将通用GHP引用转换为特定类型,如:

((GCircle) ghp).getRadius()

您可能还想查看instanceof运算符。

这个想法是:

  • 输出您覆盖toString()方法,因为您不需要任何特定于类的信息,只需打印出对象详细信息

  • 针对特定类别的操作,您将其转发为特定类型

答案 2 :(得分:0)

当您读取列表值时,编译器唯一知道的是列表包含GHP个实例。

首先检查类型,然后将其强制转换为子类。

GHP ghp = w.getList().get(0);
if(ghp instanceof GBox) {
  GBox gbox = (GBox) ghp;
  // Here you can access the method getVolume()
  /* ... */  gbox.getVolume();
}

答案 3 :(得分:0)

在基类和/或instanceof检查中添加方法的更简洁,更多OOP替代方法是使用Visitor模式,该模式允许您将对象结构与对其进行操作的任何算法分开。在这种情况下,算法只是一种“显示”算法。

也就是说,对于大多数简单的情况(比如这个),向基类添加方法并覆盖或使用instanceof都没问题。

答案 4 :(得分:0)

List<Shape> shapes = new ArrayList<Shape>();    

.... ...

for (Shape shape : shapes) {
            System.out.println(shape.getHp());
            if(shape instanceof Circle){
                System.out.println(((Circle) shape).getValuem());
            }else if(shape instanceof Box){
                System.out.println(((Box) shape).getHieght());
        }

试试这个..