第一章、多态
一、概述
1、概念
是面向对象的三大特性之一
多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。
2、意义:
2.1)-------行为的多态:(一个引用向下造型多个对象)
同一个行为:同一类型的引用,指向不同的(子类或者子类接口)对象时,相同的行为会有不同的实现
2.2) -------对象的多态: (一个对象向上造型多个引用)
同一个对象:被向上造型为不同的类型时,同一个对象有不同的功能
3、定义格式
父类类型 变量名 = new 子类类型();
变量名.方法名();
4、成员的特点(向上和向下转型都是这样)
l 多态成员变量
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
运行时期:也是调用引用型变量所属的类中的成员变量。
简单记:编译和运行都参考等号的左边。编译运行看左边。
l 多态成员方法
编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败。
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。如果对象没有成员方法,则看引用的成员方法;
简而言之:编译看左边,运行看右边。如果右边没有方法,则看左边;
5、多态-转型
5.1向下转型(强制类型转换:父类引用--赋值--子类引用)
5.1.1成功的条件只有如下两种:
(1)定义父类引用:
必须是满足父 fu = new 子();
如果是直接创建父类对象,是无法向下转型的!
(2)转换父类的引用
父类引用转换的值,就是该类型
父类引用转换的值,该类实现的接口
5.1.2注意实现
(1)强转若不符合如上两个条件,则发生ClassCastException类型转换异常
建议:在强转之前先使用instanceof来判断引用指向的对象是否是该类型
5.1.3使用格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Student stu = (Student) p; //变量p 实际上指向Student对象
5.1.4什么时候使用
需要使用子类特有功能(就是父类没有的功能)
5.2向上造型
5.2.1概念
当有子类对象赋值给一个父类引用(或者接口引用)时,便是向上转型;
5.2.2使用格式:
父类类型 变量名 = new 子类类型();
如:Person p = new Student();
5.2.3什么时候使用
当多个子类有相同的方法名,但是方法体不一样的时候;
父类中的方法可以是抽象方法,可以普通方法;