无法使用对象从 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 的超类。
我正在尝试找到一种很好的方法来迭代和打印出我的 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 的超类。