我有一个超级课程Vehicle
和三个可在其上展开的课程:Bus
,Car
和Truck
。我想要一个包含不同类型车辆的链表,我用
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}}
答案 0 :(得分:3)
是的,只要差异是私密的,那么只要不进行类型转换就可以工作。这将改变您将方法添加到未出现在界面中的方法的那一刻。
答案 1 :(得分:3)
当然,您可以制作包含List
个对象的Vehicle
:
List<Vehicle> list = new LinkedList<Vehicle>();
当你执行System.out.println(list.get(2));
时,它将获得索引2处的Vehicle
对象并在其上调用toString()
,然后将此字符串打印到控制台(您可以轻松尝试那个你自己)。
注意,如果要调用特定于Bus
,Truck
或Car
的方法(即,在其中一个类中定义而不是在超类中定义),如果没有强制转换list.get(...)
的结果,就没有办法做到这一点。
您可以调用在类Vehicle
中声明的任何方法(或在类toString()
中声明超类 - Object
)而不进行强制转换,并且该方法适用于特定对象({{将调用1}},Bus
或Truck
) - 这就是polymorphism的全部内容。