多态是面向对象编程中非常重要的概念,它是一种能力,让一个变量在不同的情况下(例如,一种不同但相关的类型),可以代表不同的行为,简单来说,就是将相同的消息发给不同的对象可能会产生不同的动作。
一、实现多态的三个必要条件
1. 继承
在一个继承体系中,子类继承父类的属性和方法,这是实现多态的前提条件。
2. 重写
在子类中,对于与父类方法同名的方法进行重写,即实现了子类对该方法的个性化实现,这也是实现多态的必要条件。例如:
public class Animal { public void eat() { System.out.println("Animal is eating."); } } public class Cat extends Animal { public void eat() { System.out.println("Cat is eating."); } } Animal animal = new Cat(); animal.eat();
结果会输出“Cat is eating.”,即子类的eat()方法被调用。
3. 向上转型
把子类的实例赋给父类引用,即父类引用指向子类对象,这样就可以通过父类引用来调用子类方法。例如:
Animal animal = new Cat(); animal.eat();
二、实现多态的方式
1. 多态参数
多态参数即方法的参数使用父类类型,但是在调用时传入子类类型的对象,实现方法的重载,这样就可以对多个子类调用同一方法。例如:
public void playSound(Animal animal) { animal.makeSound(); } public static void main(String[] args) { Cat cat = new Cat(); Dog dog = new Dog(); Animal animal = new Animal(); playSound(cat); playSound(dog); playSound(animal); }
在该例子中,playSound方法参数为父类Animal类型,接受任何Animal的子类对象,可以看到不同类型的实例调用该方法时打印的是不同的结果。
2. 多态数组
多态数组即声明一个父类数组对象,但是实际存放的是不同的子类对象,这样就可以创建一个通用的数组,用来存放多个不同的对象,并且调用相同的方法。
Animal[] animals = new Animal[2]; animals[0] = new Cat(); animals[1] = new Dog(); for (Animal animal : animals) { animal.makeSound(); }
上述例子中,声明了一个Animal类型的数组,实际存放的是Cat和Dog两个子类实例,遍历数组时,调用各自子类实例中的重写方法makeSound(),再快速快速打印出各自动物发出的声音内容。
3. 多态返回类型
多态返回类型即返回一个父类类型的对象,实际上是子类对象,这样就可以让子类对象以父类的形式返回,而不需要将子类的类型暴露给外部。例如:
public Animal getAnimal(String type) { if (type.equals("cat")) { return new Cat(); } else if (type.equals("dog")) { return new Dog(); } return new Animal(); }
该例子中在根据传入的参数type来创建不同的子类对象,然后以Animal类型的形式返回该对象。因为Animal是所有子类的父类,返回类型使用Animal类型接收,但实际上返回的是Cat或Dog类型的对象。
三、动态绑定
动态绑定是指在运行时才能决定对象调用了哪个方法的过程。Java中实现动态绑定的方法是利用虚方法(即非静态、非私有、非final方法)的动态绑定机制。当调用一个虚方法时,编译器并不确定要调用哪个实现,而是等待到实际运行时才动态决定。例如:
Animal animal = new Cat(); animal.makeSound();
上述例子中创建了一个Cat对象,使用Animal类型的引用指向该对象。那么在调用该引用的makeSound()方法时,因为Cat类中重写了Animal类的makeSound()方法,所以实际执行的是Cat类的makeSound()方法。
四、总结
多态是面向对象编程中非常重要的概念,实现多态需要满足继承、重写和向上转型三个必要条件。多态的方式有多态参数、多态数组和多态返回类型。Java中实现动态绑定的方法是利用虚方法的动态绑定机制。掌握好多态这个重要概念对于Java程序员来说是非常重要的。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/161013.html