多态
1.什么是多态?
多态就是:同一个引用类型,使用不同的实例而执行不同的操作
2.为什么要使用多态?
多态解决了程序的拓展性问题。
定义方法的时候,使用父类类型作为参数,将来使用时,使用具体的子类类型操作
例:主人(Mater)喂养宠物(Pet),宠物有很多,有猫(Cat),狗(Dog),蛇(Snake)。
主人有方法喂养feed(Pet pet),宠物有方法吃(eat),宠物吃的东西各不相同,所以要根据不同的宠物喂养不同的食物,主人喂养的方法中是使用的所有宠物的父类Pet作为参数,将来使用的时候,我们可以用父类的引用指向子类的对象,例:Pet cat = new Cat();这里我们用引用名为cat的引用指向了子类Cat,能这样定义的原因是一个对象的编译类型与运行类型可以不一致,编译类型在定义对象时,就确定了,无法改变,但是运行类型是可以改变的,编译类型就是=号的左边,即Pet,运行类型就是=号右边,即Cat,当我们调用喂养这个方法的时候(feed(cat)),编译时feed方法调用的是pet.eat(),而实际运行时,由于cat引用指向的时Cat对象,所以实际调用的是Cat.eat。这也就是多态。
代码演示:
主人(Mater):
public class Mater { public void feed(Pet pet){ //编译时多态: 编译阶段实际调用对象属于哪个类,则调用的是哪个类的方法 pet.eat(); } }
宠物(Pet):
public abstract class Pet { public abstract void eat(); }
猫(Cat):
public static class Cat extends Pet{ @Override public void eat() { System.out.println("猫吃鱼...."); } }
狗(Dog):
public static class Dog extends Pet{ @Override public void eat() { System.out.println("狗吃狗粮..."); } }
蛇(Snake):
ublic static class Snake extends Pet{ @Override public void eat() { System.out.println("蛇吃老鼠"); } }
测试运行:
public class Text_01 { public static void main(String[] args) { //主人 Mater mater = new Mater(); //宠物-狗 //Pet <- Dog Pet dog = new Pet.Dog(); Pet cat = new Pet.Cat(); //执行时多态: 执行代码时,根据对象引的引用查找堆中实际对象的方法原型。 mater.feed(dog); mater.feed(cat); } }
3.怎么实现多态?
1.继承,子类重写父类的方法。
2.父类的引用指向子类的方法。