面向对象我们讲过了封装和继承,其中继承就有extends,implements
多态是指一个实例对象继承自父类或者接口,同时兼顾自身的功能和父类,接口的功能,完成多种任务
多态声明
多态如何使用,不外乎下面的2种格式,注意2测不再是同一个类,而是右侧为左侧的继承关系
父类名 变量名 = new 子类名();
或 接口名 变量名 = new 实现类名();



如上3图,我们父类定义2个方法,子类继承父类,重写了fun方法,我们在Demo的main函数里实例化,我们可以看到,我们使用a的fun,执行的是子类的方法,但是也能执行fun2父类方法
多态成员变量使用特点
方法能进行覆盖重写,成员变量不能,多态的情况下,先去本类(等号左侧)去找,如果没有再去继承关系向上去找



如上我们使用的父子类都定义num,Demo的main方法里使用的是多态,我们打印num是Fu即等号左侧的num


又比如我们在子类里定义了父类没有的age,我们尝试去打印age就不行,因为父类本身没有,只会向上到Object里找(不会向下),没有就会标红
通过成员方法访问成员变量,从new的类往上谁有成员方法,则使用谁,没有则向上查找(子类复写使用子类,未复写使用父类)


我们在父类定义showNum,子类未定义,当然调用的是父类的showNum,然后这个方法是父类的,所以打印的是Fu类的num


如上我们子类复写了父类的方法,实际调用的是子类方法
所以我们需要区分成员变量和方法,变量是看左边往上,而方法是右边往上

我们为什么使用多态,如上,我们定义了员工类,work方法为抽象我们不知道具体是做什么,我们实现2个子类,每个都有work,我们使用多态,就可以直接使用对象的work即可
自动转换
向上自动转换就是我们常见的多态,左侧为父类,右侧为子类,这样的含义是创建子类对象,当做父类来看待,向上转型是安全的,因为是小范围转向大范围

这里需要注意的是一旦向上转型为父类,子类的特有方法就无法使用

如上,实例子类Cat转型为Animal,子类除了父类的eat还有catchMouse方法,但是向上转型后无法使用这个方法,如果我们还是想用这个方法,就涉及到对象向下转型
向下转型格式 子类名称 变量名 = (子类名)父类转型对象;这里就是将父类对象还原成子类对象,这强制类型转换必须要求父类是有当前子类转换成的,如本来是只猫,向上变成动物,然后可以强制转换成猫,但不能变成一只狗

如上,我们尝试将猫向上转换的animal还原成猫是可以的,但是转换成狗会编译能通过,但是运行报错,提示类型转换异常
instanceof进行类型判断
我们有了类型转换,就需要判断父类引用对象到底是什么子类转换来的呢
对象 instanceof 类名 返回bool值

如上,注意的是,这里instanceof属于特殊格式,没有点和括号
网友评论