我正在尝试从我的arraylist访问Car类中的方法。类层次结构基本上是:
class Vehicle {}
class Car extends Vehicle {}
class Chevy extends Car {}
class Ford extends Car {}
在此示例中,Car
类有一个名为getID()
main
方法如下所示:
Ford vehicle1 = new Ford(id, model, etc);
Chevy vehicle2 = new Chevy(id, model, etc);
ArrayList<Vehicle> list = new ArrayList<Vehicle>();
list.add(vehicle1);
list.add(vehicle2);
通过大量的试验错误,我已经能够像这样访问getID()方法:
System.out.println("Vehicle ID: " + ((Chevy) list.get(1)).getID());
哪个有效...我无法想象我正在以正确的方式做这件事。有没有更好的方法来访问这些子类方法?
答案 0 :(得分:0)
对于严肃的计划,您的Vechicle
界面应定义所有车辆共有的所有行为方法,其中应包括您的getID()
方法。但是,在某些情况下,您可能希望使用仅适用于特定类型车辆的特定方法;那么你需要在子类或Vehicle
的子接口中执行此操作。以上面的示例为例,您可能希望使用NamedVehicle
方法getID()
。如何安排您的界面和课程取决于您。如果有帮助,请参阅网桥设计模式。
说了上面的话,在非常偶然的地方,你确实想要进行明确的演员表演。
答案 1 :(得分:0)
在列表中添加子类对象似乎很好,但是当你在列表上进行迭代时,你永远不会知道会访问哪个子对象。
我建议您可以通过以下方式将父参考点指向子对象。
Car vehicle1 = new Ford(id, model, etc);
Car vehicle2 = new Chevy(id, model, etc);
然后将其添加到列表中。 当您遍历列表时,您将根据实例检查向下转换它,这将使其更加传统。
前:
Car c = (Car)list.get(0)).getID();
if(c instanceof Ford){
Ford f = (Ford)c;
System.out.println(f.getId());
}
答案 2 :(得分:0)
为什么车辆不是接口(类不能扩展接口,它们实现它)?
据我所知Vehicle
getId()
没有Car
而Vehicle
这样做,这就是为什么不将Chevy
数组列表对象转换为具有此类的System.out.println("Vehicle ID: " + ((Car) list.get(1)).getID());
数组列表对象的原因方法(如Vehicle
)会导致错误。
如果你这样做了:
interface Vehicle{
public int getId();
}
class Car implements Vehicle{ //altough I think this also should be abstract
int id;
@Override
public int getId(){
return id;
}
}
它会起作用。
我建议你让Car vehicle1 = new Ford(id, model, etc);
Car vehicle2 = new Chevy(id, model, etc);
ArrayList<Vehicle> list = new ArrayList<Vehicle>();
list.add(vehicle1);
list.add(vehicle2);
System.out.println("Vehicle ID: " + list.get(1).getID()); //Chevy ID
成为一个界面:
{{1}}
使用此配置,您可以执行以下操作:
{{1}}
答案 3 :(得分:0)
由于在getId()
类中声明了Car
方法,因此您只能通过继承访问此方法(的cource需要使用访问修饰符{{1}标记}或protected
)。
因此public
的任何子类都可以访问Car
方法,并且应该在getId()
中标记行为,除非该方法覆盖因此,在运行时,将根据当前对象类型而不是对象引用来评估方法行为。
现在来到最着名的OO(面向对象)功能之一多态(多种形式),它允许您传递需要汽车的任何Car#getId
子类型,并返回您期望Car
实例时的任何Car
子类型。
总而言之,您可以在Car
Car
ArrayList
Car
,Ford
中拥有任何Chevy
子类型,您将能够然后在列表的任何项目上调用任何Car
实例方法(无论它是什么类型,都没关系,因为它是Car
的子项。)
现在的主要问题是所描述的行为无法进入另一方,因此父引用(在您的情况下为Vehicle
)永远不会知道其后代行为(在你的情况下Car
除非在道路上遇到明确的演员表。
然后您需要简单地使用ArrayList
作为通用类型来实例化您的Car
(当您说<Vehicle>
,<Car>
时,这就是您正在做的事情) :
public static void main(String[] args)
{
Ford vehicle1 = new Ford(id, model, etc);
Chevy vehicle2 = new Chevy(id, model, etc);
ArrayList<Car> list = new ArrayList<Car>(); //Use a Car as generic type so you can call all car methods
list.add(vehicle1);
list.add(vehicle2);
for(Car car : list)
{
System.out.println(car.getId()); // Iterate over the list and retrieve each element ID
}
}