多态
多态
介绍
多态(Polymorphism)是面向对象编程的三大特性之一,它允许将父类对象设置为对子类对象的引用,这样就可以根据运行时绑定的不同子类来调用不同的行为。
多态能让程序设计更加灵活,使代码可以应对未来的扩展和变化。
知识点
类做参数:父类做参数,传递子类对象,类强制转换为其他类
多态分类:具体类多态,抽象类多态,接口多态:通过实现类对对象实例化,这是接口多态
多态的前提和体现
有继承/实现关系
方法重写
有父类引用指向子类对象
// Parent parent(父类引用) = new Son();(子类对象)
或有接口引用指向实现类对象
多态访问特点
子类继承父类后,多态访问优先执行父类方法,属性。因为子类父类中两个变量即使名字相同也是两个不同的变量,this.变量名(子类)
super.变量名(父类)。但是子类的方法重写后的方法优先级大于父类方法
多态的优点和缺点
- 提高程序的扩展性
- 定义方法的时候,使用父类型作参数,将来使用时传递具体的子类型参与操作
- 缺点:不能使用子类特有功能(只能使用子类重写的方法)
因为new 出对象为子类,所以父类指向子类那个对象的地址
- 多态的转型
- 向上转型(多态机制):从子到父
- 向下转型(强转)可能发生类型转换异常 :从父到子
案例
代码
1 | abstract class Animal{ |
运行结果
假如我现在有一个小狗,它可以==玩耍==和==吃饭==,我又收养了一个猫,猫和狗不同,猫可以==玩耍==也可以==吃饭==,问题在于狗喜欢吃骨头,猫喜欢吃鱼,你可以创建两个类,一个代表猫一个代表狗
1 | public class Cat{ |
你会发现,猫和狗play和eat方法是重复的,造成代码冗余,不美观,就算你可以忍受这两个动物类的冗余,如果我以后突然想养100种动物,你又该怎么办?很自然我们想将他们定义为抽象类Animal的子类,我们对于两者共同的方法,play()只需要在父类Animal中定义,对于两者差异的地方,eat()方法我们只需要在不同的类继承方法做到差异化实现。
一句话总结:多态是面向未来的,本例子动物种类在数量多的情况下,多态的使用会极大的提高你的清晰程度,ok到这里了,希望这篇文章能帮到你。