在Java中列出不同类型的列表

时间:2011-06-20 09:21:54

标签: java list hierarchy extends superclass

我有一个超级课程Vehicle和三个可在其上展开的课程:BusCarTruck。我想要一个包含不同类型车辆的链表,我用

list = new LinkedList<Vehicle>()

当我使用System.out.println(list.get(2))时它似乎有用,但我不明白为什么?我已将toString()函数作为实验Vehicle添加到不同的toString()类中,但它仍使用扩展的classe public class Vehicle { protected String maker; protected int year; private int fuel; //0 1 2 3 4 public Vehicle (String maker, int year) { this.maker = maker; this.year = year; this.fuel = 0; } public void drive () {...} public void fill () {...} } 。什么时候会使用父亲的功能,什么时候是儿子?

所有不同的类具有相同的功能,但具有不同的私有变量。

这些课程是:

public class Bus extends Vehicle{

    private int sits;

    public Bus (String maker, int year, int sits) {
        super (maker, year);
        this.sits = sits;
    }

    public String toString () {...}
}

总线:

public class Truck extends Vehicle{

    private int weight;

    public Truck (String maker, int year, int weight) {
        super (maker, year);
        this.weight = weight;
    }

    public String toString () {...}
}

卡车:

public class Car extends Vehicle{

    private float volume;

    public Car (String maker, int year, float volume) {
        super (maker, year);
        this.volume = volume;
    }

    public String toString () {...}
}

汽车:

{{1}}

2 个答案:

答案 0 :(得分:3)

是的,只要差异是私密的,那么只要不进行类型转换就可以工作。这将改变您将方法添加到未出现在界面中的方法的那一刻。

答案 1 :(得分:3)

当然,您可以制作包含List个对象的Vehicle

List<Vehicle> list = new LinkedList<Vehicle>();

当你执行System.out.println(list.get(2));时,它将获得索引2处的Vehicle对象并在其上调用toString(),然后将此字符串打印到控制台(您可以轻松尝试那个你自己)。

注意,如果要调用特定于BusTruckCar的方法(即,在其中一个类中定义而不是在超类中定义),如果没有强制转换list.get(...)的结果,就没有办法做到这一点。

您可以调用在类Vehicle中声明的任何方法(或在类toString()中声明超类 - Object)而不进行强制转换,并且该方法适用于特定对象({{将调用1}},BusTruck) - 这就是polymorphism的全部内容。