我们在习惯上把类的多态性称为事物存在的多种体现形态
1.何为多态?
例如 :超人 extends 人类
超人 麦克 = new 超人();
人 麦克 = new 超人();
可以看出,我们在new出的这个实体,它既具备超人的特征,同时它也具备人的特征,但是这种写法必须满足一个条件,就是超人必须是人的子类。
当类与类之间产生了联系,那么这个实体除了具备自己的类型,还具备了其他类型,我们就说这个事物存在了多种形态,即多态。
java中的多态有两种体现形式:
1:方法的重载,就是方法多态性的一种体现;
2:对象的多态性。
2.多态的前提☆☆☆
1.类与 类/接口 之间存在着关系,要么就是继续,要么就是实现;
2.子类重写父类方法;
3.父类引用指向子类对象。
3.对象的向上转型 和 向下转型
向上转型
我们经常说“老虎是哺乳动物”、“狗是哺乳动物”等,若哺乳类是老虎类的父类,这样说当然正确,但是,如果说老虎是哺乳动物,老虎将失去老虎独有的属性功能。依照这个,我们将开始介绍对象的上转型对象。
我们假设现有动物类Animal,和继承Animal类的子类Dog类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中。
例如: Animal animal = new Dog ( );
这个时候,我们称对象animal是其子类Dog ( )的上转型对象(好比说“老虎是哺乳动物”)。
对象的上转型对象的实体是子类负责创建的,但是上转型对象会失去原对象的一些属性和功能(上转型对象相当于子类对象的一个“简化”的对象)。上转型对象具有以下特点:
(1)上转型对象不能操作子类新增的成员变量(失去了这部分属性),不能调用子类新增的方法(失去了一些功能);
(2)上转型对象可以访问子类继承或者隐藏的成员变量,也可以调用子类继承的方法或者子类重写的方法。
但是我们同时要区分父类引用对象在调用重写方法和同名成员变量之间的区别,正如下图所示:
☆ 注:::在调show()方法时,父类和子类中都有该方法,而子类对该方法进行了重写,所以父类的引用对象一定会调用子类重写的方法,当然,我们说的是方法而并非成员变量,因为成员变量并没有重写这一定义,所以父类的引用对象还是会调用自身的成员变量。
向下转型
向下转型,是指将父类的引用对象再强转为子类对象,这样做的目的是为了想要调用子类中新增的成员变量或成员方法。
向下转型的强转形式,我们可以参照基本数据类型之间的转换格式来进行操作
例如: int i = 0; short j = (short ) i;
我们知道int所存储的数据长度要高于short,因此要转成short需要进行强转,根据这种格式,我们可以对父类引用对象进行强转
Animal a = new Dog ( ); Dog d = ( Dog )a; 即 父类类型 引用名 = new 子类类型();
通过这种操作我们就可以完成对象的强转。
instanceof 关键字
instanceof关键字用于判断当前父类引用对象属于子类的哪一类,常用于if判断句中
格式: 对象 instanceof 引用名 ;结果为true或者false
4.多态的注意事项
4.1 成员方法调用的特点
在运行时期,参阅对象所属的类中是否包含所要调用的方法,如果有,就调用子类的,如果子类中没有,则调用父类中的。
4.2 成员变量调用的特点
成员变量不具备多态性!当父类、子类中出现变量名重名的时候,多态状态下,看的是父类的成员变量,因为在创建子类对象时,堆内存中其实有两个成员变量,一个是父类的num,一个是子类的num,当你拿父类的引用去找num时,他就会去找自己的。
4.3 静态成员方法调用的特点
静态成员方法要谨记概念,静态成员优于对象存在,随着类的创建而创建,与类无关,如下图