笔记:JAVA_多态
一、多态的概述
多态是继封装、继承之后,面向对象的第三大特性。
多态是指同一行为,具有多个不同表现形式。
多态的好处,体现在,可以使程序编写的更简单,并有良好的扩展。
二、多态的格式
父类类型 变量名 = new 子类对象;
变量名.方法名();
三、 多态的变量调用和方法调用(以“二”中的多态格式为例)
1、变量的调用
先查看对象变量名的类型(如第二部分中格式中为父类类型)中是否存在该变量,若有则直接调用;若本类没有该变量则向上查找(父类的父类),和子类无关。
2、方法的调用
先查看对象变量名的类型是否存在该方法,若存在该方法则看该方法是否被创建的子类对象所在类覆盖重写,若已被覆盖重写,则执行子类的方法,否则执行父类的方法;若本类没有该方法,则向上查找。
四、对象的向上转型
多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
当父类引用指向一个子类对象时,便是向上转型。
格式:
父类类型 变量名 = new 子类类型();
Animal a = new Cat();
(小范围转换到大范围,可以类比于基本类型的转化,如int转化为double)
五、对象的向下转型
1、概述
向上转型一定是正确的,但是有弊端,因为对象一旦向上转型为父类,则无法调用子类原本特有的内容
对象的向下转型实际上是还原的动作。
2、格式
子类类型 变量名 = (子类名称) 父类类型();
Cat cat = (Cat) a;
(其中a为“四”中例子的父类变量名) 此处可看作强制类型转化
3、注意
在本例当中,如果该对象在创建的时候是“猫”类,则向上转型为其父类“动物”类之后,向下转型只能“还原”成为“猫”类。如果原“猫”类对象已被向上转型为“动物”,将此对象向下转型为非“猫”类(如“狗”类),则将会编译报错:ClassCastException(类转换异常)
4、引出问题
向下转型前,如何知道对象原本是“猫”还是“狗”呢?
六、instanceof关键字
格式:
对象 instanceof 类名称
这将返回一个Boolean值,即判断对象能否作为该类的实例
七、注意事项
当对象作为某个方法的参数时,若该方法定义的参数类型为此对象的父类类型(或以此对象作为实现类的接口)时,在没有编写向上转型的代码的情况下,编译并不会报错,并且能够正确执行,原因类似于基本类型数据的小范围向大范围的类型自动转换。