多态是继封装、继承之后,面向对象的第三大特性。
1、引入多态
白话来说,多态就是同一个行为具有多个不同表现形态。
eg:对于猫与狗来说,都有相同的行为“吃”。但是猫吃鱼,狗啃骨头。
2、实现多态的条件
(1)必须要有继承关系;【完成向上转型】
(2)子类必须要对父类中的方法进行重写;
(3)通过父类的引用调用重写的方法; 【发生动态绑定】
要实现多态,三个条件缺一不可。
3、向上转型和向下转型
3-1 向上转型
就是类型由小变大。 即创建一个子类对象,将其当作父类来使用。
语法格式:父类类型 对象名 = new 子类类型();
方法一:直接赋值
Animal5 cat5 = new Cat5("猫猫",2); Animal5 dog5 = new Dog5("狗狗",1);
方法二:方法传参
方法三:方法的返回值
向上转型的优点:代码实现更简单灵活;缺点:不能调用到子类特有的方法。
3-2 向下转型
即将父类对象转换到子类对象。
向下转型不安全,转换失败的话,运行时就会异常。
为了提高向下转型的安全性,引入instanceof
eg: 向下转型之后可以 调用子类自己独特的方法。
4、重写
也称覆写,覆盖。 子类重写父类方法。
重写是子类对父类中 非静态,非private修饰,非final修饰,非构造方法等的其他方法进行重写。重写的好处:子类根据自己的需要写出特定的行为。
-> 重写的规则:
(1)子类重写父类方法时, 方法的修饰符,返回值类型,方法名,参数列表(个数,类型,顺序)都必须一样;
(2)被重写的方法返回值类型可以不同,但必须是具有父子关系的;
(3)子类的访问修饰符 >= 父类的修饰符
(4)父类中被static, private修饰的方法 以及 构造方法都不能被重写;
-> 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
5、动态绑定和静态绑定
-> 动态绑定(后期绑定/晚绑定):在编译时,调用父类自己的方法,不能确定方法的具体行为;但在程序运行时,程序发生动态绑定,调用子类自己的方法。
-> 静态绑定(前期绑定/早绑定):在编译时,根据用户所传递实参类型确定了具体调用哪个方法。eg:方法的重载。
6、多态的优缺点
多态的优点体现在:可以使我们的程序编写的更简单,可以提高可维护性,并有良好的扩展性。
缺点:无法直接访问子类特有的成员。从上面的多态的好处,可以看到我们可以使用父类的参数代替了某个子类的参数,从而达到程序的扩展!但是对于某个子类有些独有的功能方法时,此时我们的多态的写法就无法访问子类独有功能了。