静态方法不体现多态性,编译和运行均依据引用类型;实例方法才体现动态多态,运行时依实际对象类型调用重写版本;成员变量和静态变量访问也只看引用类型,不参与多态。

静态方法在多态中不体现多态性,而实例方法才是动态多态的核心载体。
静态方法:编译看左,运行也看左
静态方法属于类本身,不是对象行为。调用时只取决于引用变量的声明类型(左边),和实际创建的对象类型(右边)无关。
- 即使写成
Fu f = new Zi();,调用f.staticMethod()仍执行Fu中的静态方法 - IDEA 不会提示“重写”,因为静态方法无法被重写,子类中同名静态方法只是隐藏(hiding)父类方法
- 推荐始终用
类名.方法名调用,避免用对象引用调用,防止语义混淆
实例方法:编译看左,运行看右
这才是真正的多态表现——JVM 在运行时根据实际对象类型(右边)决定调用哪个方法版本。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 前提是该方法被子类
@Override重写,且不是final、private或static - 例如
Fu f = new Zi(); f.instanceMethod();会执行Zi中重写后的方法 - 这种机制依赖 JVM 的虚方法表(vtable),是动态绑定的典型体现
成员变量和静态变量也不参与多态
不管是实例变量还是静态变量,访问都只看引用类型(左边),不会根据实际对象切换。
立即学习“Java免费学习笔记(深入)”;
-
Fu f = new Zi(); System.out.println(f.a);输出的是Fu.a的值 - 想访问子类字段,必须向下转型或直接使用子类引用
- 静态变量被所有实例共享,但访问路径仍由声明类型决定
为什么静态方法不能参与多态
根本原因在于生命周期和归属不同:
- 静态方法随类加载而存在,早于任何对象;实例方法依附于对象实例
- 多态本质是“同一消息,不同响应”,而静态方法调用不经过对象,没有“消息发送”过程
- JVM 不为静态方法生成虚方法表项,不支持运行时动态分派

















