Java 中的多态:同一个方法,多种行为
多态是面向对象编程的三大特性之一(继承、封装、多态)。在 Java 中,多态指的是同一个类型的变量,调用同一个方法,由于指向的具体对象不同,最终执行的行为也不同。
多态的核心是父类引用指向子类对象。也就是说,声明变量时使用父类类型,实际创建对象时使用子类的构造方法。
Animal a = new Dog(); // 父类引用指向子类对象
a.eat(); // 执行的是 Dog 中的 eat 方法
这里需要区分两个概念:编译时类型和运行时类型。变量 a 的编译时类型是 Animal,运行时类型是 Dog。方法的调用在运行时才真正确定,这称为动态绑定
多态成立需要满足三个条件:
存在继承关系(类之间)或实现关系(接口与类)。
子类重写了父类的方法。
父类引用指向子类对象。
如:
class Animal {
public void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("狗在汪汪叫");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("猫在喵喵叫");
}
}
public class Test {
public static void main(String[] args) {
Animal myPet = new Dog();
myPet.sound(); // 输出:狗在汪汪叫
myPet = new Cat();
myPet.sound(); // 输出:猫在喵喵叫
}
}
可以看到,同一个变量 myPet,被先后指向不同的子类对象,调用 sound() 方法的效果完全不同。这就是“多态”——同一个方法表现出多种形态。
多态带来了一个重要的好处:代码更通用,扩展性更强。例如,可以编写一个接收父类参数的方法,调用时却可以传入任意子类对象,而不需要为每个子类单独写一个方法。
需要留意的是:多态只适用于方法,不适用于成员变量。成员变量的访问仍然以编译时类型为准。
需要留意的是:多态只适用于方法,不适用于成员变量。成员变量的访问仍然以编译时类型为准。
总的来说,多态让程序能够面向抽象编程,而不是面向具体实现编程。理解多态的关键在于记住那句话:编译看左边,运行看右边。

浙公网安备 33010602011771号