向上转型后父类引用只能访问父类已声明的方法和属性,子类独有方法不可见;重写方法仍可调用且执行子类版本,对象本身仍是子类实例。

向上转型后,父类引用只能访问父类中**已声明**的方法和属性,子类新增的、独有的方法会完全不可见——编译器在编译期就拒绝调用,直接报错。
只丢失子类独有方法,不丢失重写方法
向上转型不是“删掉”子类功能,而是“限制访问范围”。关键看方法是否在父类定义过:
- ✅ 子类重写了父类方法(如 override 的
say()、eat()):仍可调用,且运行时执行子类版本(动态绑定) - ❌ 子类自己新增的方法(如
fly()、speak()、fun1(String)):父类引用无法识别,编译失败
丢失的是编译期可见性,不是运行时对象能力
对象本身仍是子类实例,所有字段和方法都完整存在,只是通过父类引用“看不到”而已。例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
p.study(); // ❌ 编译错误:Person 中无 study() 方法
p.eat(); // ✅ 正常调用,实际执行 Student.eat()
接口类型向上转型同样适用该规则
当父类是接口时,规则不变:只能调用接口中声明的方法,哪怕实现类额外提供了几十个自有方法,也一律不可通过接口引用访问。
- Animal a = new Dog(); → 只能调用 Animal 接口定义的方法
- Dog 特有的
bark()或fetch()在 a 引用下不可见
如何安全恢复子类方法?需向下转型 + 类型检查
若确定引用实际指向某子类,可先用 instanceof 判断,再强制转回子类类型:
if (a instanceof Dog) { ((Dog)a).bark(); }- 跳过
instanceof直接强转,一旦类型不符会抛ClassCastException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










