所以我有一个对象的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;
}
}
答案 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());
}
试试这个..