多态性体现为“编译时看类型,运行时看对象”,满足继承、重写、向上转型时,父类引用调用重写方法会执行子类实现;不能访问子类特有成员;支持统一接口和灵活替换;字段与静态方法不参与多态。

向上转型后的多态性,核心体现在“编译时看类型,运行时看对象”——用父类引用调用方法,实际执行的是子类重写后的方法。
调用方法时自动走子类实现
只要满足继承 + 重写 + 向上转型三个条件,父类引用调用被重写的方法,JVM 就会在运行期根据堆中真实对象的类型,去查找并执行对应子类的方法体。比如:
- Animal a = new Dog(); —— 编译类型是 Animal,运行类型是 Dog
- a.shout(); —— 编译阶段只检查 Animal 类是否有 shout() 方法;运行阶段发现 a 实际指向 Dog 对象,就调用 Dog.shout()
不能访问子类特有成员
向上转型后,引用变量只能使用父类声明的成员(字段、方法),哪怕子类有自己独有的方法或属性,也无法直接调用。例如 Dog 有 fetch() 方法,但通过 Animal 引用无法访问,编译会报错。
这是静态检查的结果:编译器只认左边的类型(Animal),不关心右边实际是什么。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
立即学习“Java免费学习笔记(深入)”;
支持统一接口,灵活替换实现
多个子类对象可以赋给同一个父类引用,后续代码无需修改就能适配不同行为。典型场景如:
- 方法参数接收父类类型:void feed(Animal pet),传入 Dog 或 Cat 都能正常运行,各自执行自己的 eat() 逻辑
- 集合存储父类类型:List
pets = Arrays.asList(new Dog(), new Cat()) ,遍历时自动触发各子类的重写方法
成员变量和静态方法不参与多态
即使子类定义了同名字段或 static 方法,向上转型后访问的仍是父类声明的部分:
- 字段访问看编译类型:Animal a = new Dog(); System.out.println(a.name); 输出的是 Animal 的 name 值
- 静态方法调用看编译类型:a.staticMethod() 永远执行 Animal.staticMethod(),与实际对象无关

















