1

我有一个超类Vehicle和三个在其上扩展的类BusCarTruck. 我想要一个包含不同类型车辆的链接列表,我使用

list = new LinkedList<Vehicle>()

当我使用它时它似乎工作System.out.println(list.get(2)),但我不明白为什么?我已将实验toString()功能添加到不同的Vehicle类中,但它仍然使用扩展类的toString(). 什么时候使用父亲的功能,什么时候使用儿子的功能?

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

课程是:

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 () {...}
}
4

2 回答 2

3

是的,只要差异是私有的,它就可以在没有类型转换的情况下工作。当您将方法添加到未出现在界面中的方法时,这将改变。

于 2011-06-20T09:24:09.797 回答
3

当然你可以制作一个List包含Vehicle对象的:

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

当您这样做System.out.println(list.get(2));时,它将获取Vehicle索引 2 处的对象并调用toString()它,然后将此字符串打印到控制台(您当然可以自己轻松地尝试一下)。

请注意,如果您要调用特定于 a 的方法BusTruck或者Car(即,在这些类之一中而不是在超类中定义),那么如果不强制转换list.get(...).

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

于 2011-06-20T09:26:25.087 回答