父类引用无法调用子类特有方法,因编译器仅依据声明类型检查成员;需instanceof判断后强制转型才能调用;频繁转型提示设计应提升抽象层次或使用接口、策略模式。

父类引用无法调用父类未定义的方法,这不是机制“处理”了它,而是编译器直接拒绝——这类调用在编译阶段就会报错,根本不会进入运行时。
编译期拦截:类型检查卡在声明类型上
Java 是静态类型语言,变量的编译期类型(即声明类型)决定了它能访问哪些成员。例如:
Animal a = new Dog(); a.bark(); // 编译错误:cannot find symbol method bark()
这里 a 的声明类型是 Animal,而 Animal 类中没有 bark() 方法。编译器只看左边,不关心右边实际是什么对象,因此直接报错。
想调用子类特有方法?必须显式转型
要访问子类独有的行为,需先确认类型、再安全转换:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
- 用 instanceof 判断实际类型,避免空指针和类型异常
- 用括号强制向下转型,获得子类引用
- 之后才能调用该子类定义的方法
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark(); // ✅ 此时合法
}
更好的设计:让“特有”变“共有”
频繁需要转型调用子类方法,往往说明抽象层次有问题。可考虑:
- 把语义一致的操作提取为父类的抽象方法或默认方法
- 用接口统一契约,让不同实现各自提供对应逻辑
- 引入策略模式,把行为差异外移到独立类中,避免业务代码感知具体类型
注意:这些情况也不参与多态
即使方法名相同,以下几类也不会动态绑定:
- static 方法:调用取决于引用类型,不是实际对象
- private 方法:不能被重写,子类里同名方法只是新方法
- final 方法:禁止重写,始终执行父类版本
- 字段(成员变量):访问的是声明类型的字段值,不存在重写概念

















