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

关键在于调用机制不同:this调用的是实例方法,走动态绑定;static调用的是类方法,走静态绑定。
that this指向的是运行时对象,决定方法版本在运行时才确定
当用 this.methodName() 调用时,JVM根据实际对象的类型(而非引用类型)查找方法表,找到子类重写后的方法执行。这就是多态的基础——动态绑定。
- 方法必须是非static、非private、非final的实例方法
- 子类重写需满足:方法名、参数列表、返回类型一致,访问权限不更低
- 即使声明为父类类型,只要实际是子类对象,就执行子类版本
static方法属于类本身,与对象无关,编译期就锁定调用目标
static方法随类加载而存在,不依赖任何对象实例。调用时只看引用变量的声明类型(或直接用类名),和实际创建的对象类型无关。
- 例如 Parent p = new Child(); p.staticMethod(); —— 调用的是Parent类的staticMethod
- 哪怕Child中定义了同签名的static方法,也只是“隐藏”(hiding),不是重写(override)
- JVM在编译阶段就将符号引用解析为具体类的静态方法地址,无需运行时查表
本质区别:绑定时机与作用域不同
重写(override)的前提是方法行为需随对象变化而变化;而static方法设计初衷就是提供稳定、通用的工具能力,它不操作实例状态,也不应被子类“定制行为”。
- 动态绑定:实例方法 → 运行时查对象所属类的方法表 → 支持多态
- 静态绑定:static方法 → 编译时按引用类型确定类 → 不支持多态
- 所以,this.method() 可以被重写,ClassName.method() 或 ref.method()(ref为static方法所属类型)则不能
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











