我有一个车辆类。从Vehicle,我扩展了Car class(以及其他一些如Bus,Bike ..)。现在在我的应用程序中,我不知道用户想要使用哪种车辆。所以我创建了一个Vehicle对象,然后将其设置为正确的对象(Car,Bus,...)。之后,我想调用一些Car的功能 - 但我无法达到它。为什么呢?
Vehicle vehicle=null;
. . .
vehicle=new Car();
vehicle.someMethodFromCar(); //can't reach it
答案 0 :(得分:7)
我们必须施展:
((Car) vehicle).someMethodFromCar(); //we can reach it
vehicle
仍被声明为Vehicle
类型。如果您指定Vehicle
的子类型,则不会更改。并且Vehicle
类没有Car
类中的额外方法。转换是从子类型调用方法的方法。
答案 1 :(得分:3)
你的引用是由它的声明类型定义的,所以在你的情况下,你有一个赋予Car对象的Vehicle引用vehicle
,但是java只能看到引用的类型,所以你不能访问任何引用汽车的方法。
为此,您需要将对象分配给Car变量,或者将引用转换为Car。
答案 2 :(得分:1)
为了达到该方法,您必须将vehicle
投射到Car
。
答案 3 :(得分:1)
有两种方式:
将车辆视为抽象类。在车辆类中将常用方法定义为抽象。因此,当您扩展车辆时,子类需要实现抽象方法。所以,当你做的时候
Vehical v = new Car();
v.someOverrideMethod(); 它将调用汽车的方法。
覆盖您希望在子类中运行时访问的方法。所以,当你喜欢的时候,
Vehical v = new Car();
v.someOverrideMethod();
在运行时,JVM将查看其对象是否已创建,并且该对象的方法将在运行时调用。