this调用实例方法,走动态绑定,运行时根据实际对象类型确定方法版本;static调用类方法,走静态绑定,编译时按引用类型锁定目标,不支持重写只支持隐藏。

关键在于调用机制不同:this调用的是实例方法,走动态绑定;static调用的是类方法,走静态绑定。
that this指向的是运行时对象,决定方法版本在运行时才确定
当用 this.methodName() 调用时,JVM根据实际对象的类型(而非引用类型)查找方法表,找到子类重写后的方法执行。这就是多态的基础——动态绑定。
- 方法必须是非static、非private、非final的实例方法
- 子类重写需满足:方法名、参数列表、返回类型一致,访问权限不更低
- 即使声明为父类类型,只要实际是子类对象,就执行子类版本
static方法属于类本身,与对象无关,编译期就锁定调用目标
static方法随类加载而存在,不依赖任何对象实例。调用时只看引用变量的声明类型(或直接用类名),和实际创建的对象类型无关。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 例如 Parent p = new Child(); p.staticMethod(); —— 调用的是Parent类的staticMethod
- 哪怕Child中定义了同签名的static方法,也只是“隐藏”(hiding),不是重写(override)
- JVM在编译阶段就将符号引用解析为具体类的静态方法地址,无需运行时查表
本质区别:绑定时机与作用域不同
重写(override)的前提是方法行为需随对象变化而变化;而static方法设计初衷就是提供稳定、通用的工具能力,它不操作实例状态,也不应被子类“定制行为”。
立即学习“Java免费学习笔记(深入)”;
- 动态绑定:实例方法 → 运行时查对象所属类的方法表 → 支持多态
- 静态绑定:static方法 → 编译时按引用类型确定类 → 不支持多态
- 所以,this.method() 可以被重写,ClassName.method() 或 ref.method()(ref为static方法所属类型)则不能

















