Java中父类数组存放子类对象后能否调用子类方法?
Java父类数组存放子类对象的常见问题
1. 能否创建父类类型数组存放子类对象?
可以。这是Java多态特性的典型应用,子类与父类之间存在is-a的继承关系(比如Dog是Animal的一种),因此父类类型的引用可以指向子类对象,数组作为引用类型的集合,自然支持这种操作。
2. 为何无法直接调用子类专属方法?
你遇到的编译错误,核心原因是编译时类型与运行时类型不匹配:
- 数组
c的声明类型是Animal[],所以数组中每个元素的编译时类型都是Animal。 - Java编译器在编译阶段只会检查编译时类型是否包含目标方法,而
Animal类中并没有定义setBreedOfDog这个子类专属方法,因此直接调用会触发编译错误。 - 虽然运行时
c[0]实际是Dog对象,但编译器不会提前知晓这一点,它只遵循变量的声明类型进行校验。
3. 如何正确调用子类专属方法?
需要先将父类类型的引用强制转换为子类类型,同时为了避免类型转换异常,建议先做类型检查:
传统写法(适用于所有Java版本)
Animal[] c = new Animal[6]; c[0] = new Dog(new Animal()); // 先判断类型,再转换调用 if (c[0] instanceof Dog) { Dog dog = (Dog) c[0]; dog.setBreedOfDog("Pug"); }
Java 16+ 模式匹配写法(更简洁)
Animal[] c = new Animal[6]; c[0] = new Dog(new Animal()); // 模式匹配直接转换并赋值 if (c[0] instanceof Dog dog) { dog.setBreedOfDog("Pug"); }
内容的提问来源于stack exchange,提问作者Smile D
相关产品推荐
相关产品推荐

