无法从具有对象的超类到达字段

时间:2015-01-27 13:00:32

标签: java oop object iteration superclass

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

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

对象的新实例如下所示:

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

Car(以及其他类,如Bike,Bus等)是Vehicle的子类。

车辆类:

public class Vehicle {

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

public Vehicle(){}

}

汽车班:

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中获得颜色和品牌字符串。但我猜测,因为我是一个新的对象,也许它无法访问与Car,Bus等相关的字段和方法?

有没有办法解决这个问题?或者这可能不是实际问题?

4 个答案:

答案 0 :(得分:2)

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

然后it.next()将返回对Vehicle的引用,这将允许您访问Vehicle的所有公共成员。

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);
}

答案 1 :(得分:0)

将对象投射到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 + " ");
}

答案 2 :(得分:0)

将您的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中应为小写,以便更好地阅读代码。

答案 3 :(得分:0)

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

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