实现游泳接口的对象单独可调用swim,放入Animal数组遍历为何无法调用?
问题原因
- 向上转型后方法调用受父类定义限制:你定义的
Animal父类没有声明swim()方法,子类对象存入Animal类型数组后会发生向上转型,Java编译阶段只会校验引用类型(也就是Animal)中是否存在调用的方法,找不到swim()自然会触发编译错误。单独调用fish的swim()可正常执行,是因为fish变量本身的类型是实现了游泳接口的子类,编译器可以在子类中找到对应方法定义。 - 存在未实现游泳接口的对象:数组中的老鹰没有实现游泳接口,就算
Animal类定义了swim()方法,老鹰调用该方法也不符合业务逻辑,甚至可能抛出运行时异常。
解决方案
根据你的业务场景可以选择以下两种方案:
- 若所有动物都需要有游泳相关的行为定义,直接在
Animal父类中声明swim()方法,各个子类按需重写即可,老鹰的重写逻辑可以直接返回0或者提示不会游泳。 - 若只有部分动物具备游泳能力,遍历过程中增加类型校验,先判断对象是否实现了游泳接口(假设接口名为
Swimable),强转后再调用方法:
// 假设游泳接口定义为Swimable Animal [] animals = {fish, carp, tiger, elephant , eagle}; for (Animal a : animals) { if (a instanceof Swimable) { Swimable swimAnimal = (Swimable) a; System.out.println(a.getType() + " 游了 " + swimAnimal.swim() + " 米"); } else { System.out.println(a.getType() + " 不会游泳"); } } // fish变量本身是实现了Swimable接口的子类类型,可直接调用 fish.swim();
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

