链继承java

时间:2017-03-07 14:13:25

标签: java oop inheritance

我正在努力实施一个帮助车辆社会

但我首先关注车辆部件 车辆可以是HeadQuarter或机器

然后将机器指定为支持车辆(SV)或紧急车辆(EV)

EV和SV都扩展了扩展车辆的机器

机器是特别的,因为它们可以传输人员,所以我在机器类中定义了一个方法Embark(String),它将字符串存储在arraylist中,这是机器类的一个属性。

然后我进入了社会实施,一个社会有一个车辆的ArrayList(可以是一台机器(指定成EV或SV)或HQ)但是当我试图将人们带入SV时,我无法访问机器方法

我真的不明白为什么有人可以解释我?非常感谢你

这是Society.java

import Vehicle.*;
import Vehicle.machine.SupportVehicle;
import Vehicle.machine.EmergencyVehicle;
import Vehicle.machine.*;

public class Society {
private ArrayList <Vehicle> Vehicles;
public void AddVehicle(Vehicle V1){
    this.Vehicles.add(V1);
}

public Society(){
    this.Vehicles = new ArrayList<Vehicle>();
}

public static void main(String[] args){

    Society S;
    S = new Society();

    SupportVehicle SV;

    SV =  new SupportVehicle();

    Vehicle V1; 
    V1 = new Vehicle();
    S.AddVehicle(V1);
    S.Vehicles.get(0).embark("bar"); // Embark is a Machine Method but i can't access it  : " The method Embark(string) is undefined for the type Vehicle

}

}

4 个答案:

答案 0 :(得分:1)

问题是这个“所以我在机器类中定义了一个方法Embark(String)”,你想从车辆中访问该方法。

机器扩展车辆,因此车辆无法访问机器的方法。

一种可能的解决方案是将该方法添加到Vehicle类。

另一种解决方案是使用私有ArrayList计算机而不是私有ArrayList Vehicles;

如果你想使用((机器)S.Vehicles.get(0))。embark(“bar”);你应该首先检查instance =“if S.Vehicles.get(0)instanceof Machine”

PS:变量应以小写=)

开头

答案 1 :(得分:0)

您的问题是,您通过Vehicle - 类“眼镜”“查看”您的对象,因为您想在S.Vehicles.get(0)上调用该方法而Vehicles是一个列表类型为Vehicle。在这种情况下,您只能看到Vehicle - 类的功能。要查看Machine - 类的方法,您需要将对象强制转换为Machine - 类首先:

((Machine)S.Vehicles.get(0)).embark("bar");

答案 2 :(得分:0)

embark( String str)是在Machine类和Vehicle类中定义的方法。编译器不知道Society.Vehicles包含Machine类的实例,因为它可能包含Vehicle Class本身或其他扩展的实例。

1)如果您知道社会中的所有车辆实例都是机器实例,而不仅仅是按照以下方式更改车辆类型

private ArrayList <Machine> Vehicles;

2)如果以上情况不是真的,那么将有助于

if(S.Vehicles.get(0) instanceof Machine)
{
    ((Machine)S.Vehicles.get(0)).embark("Something");
}

答案 3 :(得分:0)

大家好,谢谢大家的回答,我全部阅读,我发现这个问题是编译问题, 我在vechile中添加了一个方法embark(string n1),并在机器中覆盖它,这样当我执行我的代码时,一切顺利