Java:从arraylist中的对象访问子类方法

时间:2014-09-17 09:36:28

标签: java oop arraylist

我正在尝试从我的arraylist访问Car类中的方法。类层次结构基本上是:

class Vehicle {} 
class Car extends Vehicle {} 
class Chevy extends Car {}
class Ford extends Car {}

在此示例中,Car类有一个名为getID()

的getter

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

哪个有效...我无法想象我正在以正确的方式做这件事。有没有更好的方法来访问这些子类方法?

4 个答案:

答案 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()没有CarVehicle这样做,这就是为什么不将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 CarFord中拥有任何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
  }
}