java中静态方法调用不支持多态,编译和运行均依据引用类型(左边类)决定,子类同名方法仅隐藏而非重写,属编译期早期绑定。

Java 中多态调用静态方法时,**编译和运行都看引用类型左边的类(即父类)**,不看实际创建的对象类型。
静态方法不参与多态
静态方法属于类本身,不是对象的行为,因此不会被重写(override),只可能被隐藏(hide)。子类中定义同名静态方法,只是覆盖了父类的可见性,而非真正意义上的重写。
- 编译阶段:检查引用类型(等号左边)所属类中是否存在该静态方法;不存在则报错
- 运行阶段:直接执行引用类型所属类中的静态方法,与 new 出来的实际对象类型无关
- 即使子类有同签名静态方法,也不会被调用
调用方式推荐使用类名,而非对象
虽然语法上允许用对象名调用静态方法(如 obj.staticMethod()),但这是编译器“假象”——字节码中已被自动替换为类名调用(如 ParentClass.staticMethod())。
- 用父类引用指向子类对象,再调用静态方法,执行的是父类的逻辑
- 用子类对象直接调用(new Child().staticMethod()),执行的是子类的逻辑
- 所以关键不在对象是谁,而在“谁在调用”——即引用变量声明的类型
和成员变量、非静态方法对比更清楚
静态方法的访问规则和成员变量一致(都是“编左运左”),但和非静态方法相反(非静态方法是“编左运右”):
- 成员变量:编译看父类,运行也看父类(不支持多态)
- 静态方法:编译看父类,运行也看父类(不支持多态)
- 非静态方法:编译看父类(需存在),运行看子类(支持多态)
本质上,静态方法绑定发生在编译期(早期绑定),而非运行期。所以它不体现多态的核心价值——运行时动态决定行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











