java实现多态必须同时满足三个条件:存在继承或实现关系、子类重写父类非静态非私有非final方法、父类或接口类型引用指向子类对象。

Java 中实现多态必须同时满足三个条件:存在继承关系、子类重写父类方法、使用父类类型引用指向子类对象。
有继承关系(或实现接口)
多态的基础是类之间的层次结构。可以是类继承类,也可以是类实现接口。没有继承或实现,就不存在“同一行为不同实现”的前提。
- 例如:
class Dog extends Animal或class FileLogger implements Logger - 抽象类和接口本身不能实例化,但可作为引用类型参与多态
子类重写父类的非静态、非私有、非 final 方法
只有被重写的方法,在运行时才能根据实际对象类型调用对应版本。构造方法、static 方法、private 方法、final 方法无法被多态调度。
-
private void speak()不会被子类继承,更谈不上重写和多态 -
static void info()调用取决于引用类型,不是运行时绑定 - 重写需满足:方法名、参数列表、返回类型(协变返回类型除外)一致,访问权限不能更严格
父类(或接口)引用指向子类对象
这是触发动态绑定的关键。编译看左边(引用类型),运行看右边(实际对象类型)。
- 正确示例:
Animal a = new Dog(); a.sound();→ 调用Dog.sound() - 错误示例:
Dog d = new Dog(); d.sound();是普通调用,不体现多态 - 接口引用同样适用:
Runnable r = () -> System.out.println("run"); r.run();
三个条件缺一不可。少了继承,无从谈起重写;没重写,所有调用都走父类逻辑;没用父类引用,编译器直接绑定到子类方法,失去运行时选择能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











