多态:多种形态,理解多态一定要结合继承关系来理解,可以说没有继承就没有多态
因此也可以说多态其实就是对象的多种类型
多态的目的:提高代码/系统的扩展性!
定义:同一个引用类型,使用不同的实例/对象而执行不同操作
同类型的对象,执行同一个行为,会表现出不同的行为特征(使用不同的实现逻辑)
父类类型,使用子类对象,然后调用子类重写父类的方法(父类引用指向子类对象)
父类作为方法形参时,在调用该方法时,实际传入的对象是什么类型,就调用的是谁里面的方法
例子:
父亲买了一个快递,过了几天,快递到了,但是父亲出差在外地
父亲有三个孩子:哥哥、弟弟、妹妹
现在哥哥、弟弟、妹妹都可以代替父亲去取快递
也就是说,真正取快递时,用的是谁的取快递的方法?————孩子的方法
若父亲没有取快递的方法,就好比父亲压根没买东西,孩子当然不能用父亲的名义取快递
只能用自己的名义取快递,而且只能取自己的快递!
多态的优势和应用场合
实现多态的三个要素
子类继承父类:
子类要使用父类的类型来调用相关方法
子类重写父类方法:
子类重写父类的方法的目的:提高代码的可扩展性
子类如果不重写父类的方法,那么在使用父类类型的子类对象时,就无法调用真正要使用的子类中的方法
父类引用指向子类对象:
真正意义上使用多态的方式来执行程序
对象是子类的对象,但是是由父类的类型来声明的
父类类型 对象名 = new 子类构造方法();
声明创建一个宠物,实际上用的是狗子的狗子的构造方法创建的宠物对象
父类作为形参,传入的实参是子类的对象
父类作为返回值,返回的实际是子类的对象
只要子类重写了父类的方法,不管用的是父类引用还是子类引用,调用的都是子类重写过的方法
父类引用指向子类对象,可以调用父类独有的方法
父类引用指向子类对象,可以调用父类中所有方法(特殊访问修饰符权限除外),
但是如果该方法被子类重写时,调用的就是子类重写过的方法
父类引用指向子类对象时,就不再能调用子类独有的方法
子类独有的方法:子类有该方法,而父类中没有该方法
父类引用指向子类对象满足自动类型转换
=表示赋值运算符,表示将=右边的值赋值给=左边
=左边是目标类型,=右边是源类型
自动类型转换需要满足:目标类型大于源类型,
在多态中,自动类型转换也可以叫做向上转型(将子类的对象用父类的类型表示出来)
程序遵循:实现的难易守恒!——————周老师定理!
一方简易,另一方必然复杂——————复杂度是守恒的
实现多态的两种形式:
父类作为方法形参实现多态(提高实现方的扩展性)
这样子可以只定义一个方法,而不需要为每个子类的对象都定义一个方法,提高代码的可重用性
而且后续再扩展其它子类时,也不需要再添加新的方法,这样可以提高代码的扩展性
父类作为返回值实现多态(提高调用方的扩展性)
在实现的方法中,将子类的对象以父类类型返回,这样在调用者方就不用关心具体如何实现
调用者只需要在调用者方根据不同的需求就能得到想要的对象,
即使再扩展了新的子类,调用者方也不需要添加新的实现,这样可以提高代码的扩展性
父类和子类之间的类型转换
理解父类引用指向子类对象(重点)