java多态通过父类引用指向子类对象实现,需满足继承(或实现接口)、方法重写、父类引用指向子类实例三个条件;编译看引用类型,运行看实际对象类型,仅重写实例方法体现动态绑定。

Java 中多态通过“父类引用指向子类对象”实现,核心在于编译看左边(引用类型),运行看右边(实际对象类型)。这要求满足三个条件:继承(或实现接口)、方法重写、父类引用指向子类实例。
必须有继承或实现关系
只有存在 IS-A 关系,才能用父类类型声明变量,指向子类对象。例如:
class Animal { void sound() { System.out.println("Animal makes a sound"); } }
class Dog extends Animal {
@Override void sound() { System.out.println("Dog barks"); }
}
此时 Animal a = new Dog(); 合法;但 Animal a = new String(); 编译报错,因为无继承关系。
必须重写父类中被调用的方法
只有被重写的方法才体现运行时多态。未重写的方法(包括静态方法、private 方法、构造器)按引用类型(父类)决定行为:
-
重写方法(如
sound()):调用子类版本,动态绑定 -
静态方法:看引用类型,
Animal.staticMethod()永远调用 Animal 的静态方法 - 成员变量:访问的是引用类型声明的变量(不建议隐藏父类字段)
创建对象时用 new 子类,但引用声明为父类
这是语法关键。不是强制转换,而是直接赋值:
Animal a1 = new Dog(); // ✅ 多态:编译通过,运行时执行 Dog.sound() Animal a2 = new Cat(); // ✅ 同理 // Animal a3 = new Animal(); // ❌ 是向上转型,但没体现子类特异性,不算典型多态应用
注意:Dog d = (Dog) new Animal(); 会抛 ClassCastException,因为父类对象不能强转为子类。
多态常配合方法参数和集合统一处理
提升代码扩展性。例如定义一个处理动物的方法:
void makeSound(Animal a) { a.sound(); } // 接收任意 Animal 子类
List<animal> animals = Arrays.asList(new Dog(), new Cat(), new Bird());
for (Animal a : animals) a.sound(); // 自动调用各自重写的 sound()
</animal>
新增 Fish 类只需继承 Animal 并重写 sound(),原有遍历逻辑无需修改。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











