【问题标题】:Can't reach fields from super class with object无法使用对象访问超类中的字段
【发布时间】:2015-03-26 02:34:18
【问题描述】:

我正在尝试找出一种很好的方法来迭代并打印出我的 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 中一样访问颜色和品牌字符串。但我猜测,由于 i 是一个新对象,它可能无法访问与 Car、Bus 等相关的字段和方法?

有没有办法解决这个问题?或者这可能不是真正的问题?

【问题讨论】:

  • 可能值得注意的是,我所有的对象都被放入了一个名为 Ferry 的 ArrayList 中

标签: java oop object iteration superclass


【解决方案1】:

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

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

【讨论】:

  • 真的希望我能投票,所有这些答案都很棒!谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:
        Iterator<Vehicle > it = Ferry.iterator();
    while(it.hasNext()){
        Vehicle i = it.next();
        System.out.println(i + " ");
    }
    

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

    【讨论】:

      【解决方案4】:

      将您的Ferry 重新声明为List&lt;Vehicle&gt; 类型。

      那么你就可以像这样使用它了

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

      【讨论】:

        猜你喜欢
        • 2010-11-12
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 2019-03-20
        • 1970-01-01
        相关资源
        最近更新 更多