static方法不参与多态,因其属于类而非对象,不会被重写而只能被隐藏;调用取决于引用的声明类型而非实际类型,编译期即绑定,不满足多态三条件。

static 方法不参与多态
Java 中被 static 修饰的方法属于类本身,不是对象的行为,因此**不会被重写(override)**,也就**无法体现运行时多态**。即使子类定义了与父类同名、同参数列表的 static 方法,这也不是重写,而是“隐藏”(hiding)。调用哪个 static 方法,完全取决于**引用变量的声明类型(编译时类型)**,而不是实际指向的对象类型。
编译看左边,运行也看左边
这和普通实例方法的“编译看左边,运行看右边”截然不同:
- 父类
Parent有public static void show() { System.out.println("Parent"); } - 子类
Son有public static void show() { System.out.println("Son"); } - 代码:
Parent p = new Son(); p.show();→ 输出 "Parent" - 即使写成
Son s = new Son(); s.show();→ 输出 "Son"
关键在于:调用的是哪个类名后跟的 .show(),不是对象实际是哪个类的实例。
static 变量也不支持多态语义
静态变量属于类,所有实例共享一份。它没有“多态性”的概念,但要注意:
- 访问静态变量也按引用声明类型决定——
Parent.count和Son.count访问的是同一块内存,但如果子类中定义了同名 static 变量,则同样发生“隐藏”,而非覆盖 - 不能通过多态方式动态切换静态成员的归属;它的归属在编译期就绑定了类名
多态成立的前提不包含 static 成员
真正能体现多态的,必须满足三个条件:
- 继承或实现接口
- 方法被重写(非 private、非 static、非 final)
- 父类引用指向子类对象
而 static 方法天然不满足第二条,所以它不在多态机制的作用范围内。想获得类似效果,应改用实例方法 + 重写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











