如何实例化抽象父类Equipment类型的List参数?Java面向对象开发疑问
原提问内容
本次练习的部分内容如下:
我创建了名为Equipment的抽象父类,它包含ConcreteMixer在内的4个子类。练习要求我创建Job类,其构造方法如图所示。我不理解其中List<Equipment>类型参数的含义,但还是按照要求完成了类的编写,并在main函数中对Job进行了实例化。
我不清楚实例化后该参数的结果与Equipment及其子类有什么关联,相关代码如下:
public abstract class Equipment { String requirement; public Equipment(String requirements){ this.requirement=requirements; } public String getRequirement() { return requirement; } } public class ConcreteMixer extends Equipment{ public ConcreteMixer(String requirement){ super(requirement); } public String toString(){ return requirement; } @Override public boolean equals(Object obj) { if(obj instanceof ConcreteMixer) { ConcreteMixer that = (ConcreteMixer) obj; return this.requirement.equals(that.requirement); } return false; } } public Job(Address location, String description,List<Equipment> requiredEquipment, Date plannedDate) { this.location = location; this.description = description; this.requiredEquipment = requiredEquipment; this.plannedDate = plannedDate; } public static void main(String[] args) { Job s= new Job(new Address("Star street",16, "da","London"),"mixer",new ArrayList<Equipment>(),new Date(12,5,21)); System.out.println(s); } }
运行结果
location:Address isLondonStar street16da description:mixer requiredEquipment:[] plannedDate:day:12 month:5 year:21
疑问解答
List<Equipment>参数的含义
这个参数用来存储当前作业需要用到的所有设备实例集合。Java泛型规则限定了这个列表只能存入Equipment类型的对象,由于Equipment是抽象类无法直接实例化,实际上就是可以存放它的所有子类的实例,包括你写的ConcreteMixer和另外3个自定义子类,是Java多态特性的典型应用。- 参数和
Equipment子类的关联逻辑
你当前运行结果里requiredEquipment输出为空,是因为你实例化Job的时候传入的是刚初始化的空ArrayList,没有往列表里添加任何子类实例。你可以按照下方调整代码就能看到实际关联效果:
public static void main(String[] args) { // 先创建ConcreteMixer子类实例 ConcreteMixer mixer = new ConcreteMixer("150L小型混凝土搅拌机"); // 初始化设备列表,添加对应的设备实例 List<Equipment> equipmentList = new ArrayList<>(); equipmentList.add(mixer); // 实例化Job的时候传入填充好的设备列表 Job s= new Job(new Address("Star street",16, "da","London"),"mixer",equipmentList,new Date(12,5,21)); System.out.println(s); }
调整后再运行,requiredEquipment字段就会输出你存入的搅拌机的requirement属性值,也就是你重写的ConcreteMixer类toString方法的返回内容。
后续如果需要在Job类中统一处理所有设备的逻辑,比如批量获取所有设备的要求,直接遍历requiredEquipment列表调用getRequirement()方法即可,不需要区分每个对象具体属于哪个Equipment子类,能大幅简化代码逻辑。
内容的提问来源于stack exchange,提问作者yiran ding
相关产品推荐
相关产品推荐

