无法使用对象从 super class 访问字段

Can't reach fields from super class with object

我正在尝试找到一种很好的方法来迭代和打印出我的 ArrayList 中的对象。

问题是我似乎无法到达用户正在键入对象信息(例如颜色和品牌)的字段。

对象的新实例如下所示:

Vehicle C = new Car(4, "Blue", "Honda");

汽车(以及其他 class 类,例如自行车、公共汽车等)是车辆的子类 class。

车辆class:

public class Vehicle {

public int pass = 0;
public int cost = 0;
public int size = 0;
public String brand = "";
public String color = "";

public Vehicle(){}

}

汽车class:

public class Car extends Vehicle{

// constructor
public Car(int passengers, String col, String brandOfVehicle){
    if (passengers < 0 || passengers > 4){
        throw new IllegalArgumentException();
    }else
        pass = passengers;
        cost += pass*15 + 100;
        size = 5;
        color = col;
        brand = brandOfVehicle;
}

} 尝试遍历对象时:

        Iterator<Object> it = Ferry.iterator();
    while(it.hasNext()){
        Object i = it.next();
        System.out.println(i + " ");
    }

当遍历对象时,我想达到 i.color 中的颜色和品牌字符串。但我猜测,因为 i 是一个新对象,所以它可能无法访问与 Car、Bus 等相关的字段和方法?

有什么办法可以解决这个问题吗?或者这可能不是实际问题?

将对象转换为 vihecle 并且有效:

Iterator<Object> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = (Vehicle)it.next();
    System.out.println(i + " ");
}

您还可以检查是否有来自 Vehicle 的子类,然后进行转换。

或者如果只有 Vehicle 可以乘坐渡轮,您可以将列表更改为:

Iterator<Vehicle> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i + " ");
}

我不知道 Ferry 的类型是什么,但也许 Ferry.iterator() 应该 return 一个 Iterator<Vehicle> 而不是 Iterator<Object>

然后 it.next() 将 return 引用 Vehicle,这将允许您访问 Vehicle 的所有 public 成员。

Iterator<Vehicle> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i.color);
}

如果 Ferry 可以包含不是 Vehicle 的对象,您将不得不使用转换:

Iterator<Object> it = Ferry.iterator();
while(it.hasNext()){
    Object i = it.next();
    if (i instanceof Vehicle)
        System.out.println(((Vehicle)i).color);
}

将您的 Ferry 重新声明为类型 List<Vehicle>

那你就可以像这样使用了

Iterator<Vehicle> it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i + " ");
}

或者更简单:

List<Vehicle> ferry = ...;
while(Vehicle v: ferry)){
    System.out.println(v + " ");
}

请注意,Java 中的变量名称应小写,以便更好地阅读您的代码。

    Iterator<Vehicle > it = Ferry.iterator();
while(it.hasNext()){
    Vehicle i = it.next();
    System.out.println(i + " ");
}

您无法访问这些属性,因为您转换为 Object 类型,它是您的 Vehicle 的超类。