Java基础14-多态(思想、转型、instanceof)
一、什么是多态?
1.多态的定义
多态,字面意思就是多种状态,他表示一种事物的多种状态。
class Animal{ public void eat() { System.out.println("吃一般的食物"); } } //狗和猫类继承动物类并重写eat方法 class Dog extends Animal{ public void eat() { System.out.println("吃骨头"); } } class Cat extends Animal{ public void eat() { System.out.println("吃鱼"); } } public class duotai { public static void main(String[] args) { //当代码变为一下样子多态就产生了 Animal a=new Dog(); a.eat(); a=new Cat(); a.eat(); } }
上边对象a具有两种类型
编译类型:声明对象变量的类型,Animal表示把对象看出什么类型
运行类型:对象的真实类型,Dog运行类型 对象的真实类型
编译类型必须是运行类型的父类或相同
当编译类型和运行类型不同的时候,多态就出现了
所谓多态:对象具有多种形态,对象可以存在不同的形式。
其实就是,我们创建了一个动物对象,这个动物对象即可以是猫,也可以是狗,是猫的时候吃鱼,是狗的时候吃骨头。
Animal a=new Dog() //此时a表示Dog类型的形态
a=new Cat() //此时a表示Cat类型的形态
2.多态的前提和特点
多态的前提:必须有继承关系(错误的说法)
可以是继承关系,也可以是实现关系(接口和实现类)。正确
多态的特点:
把子类对象赋给父类变量,在运行时期会表现出具体的子类特征
2.多态的好处
假设我们目前有这样的需求,给饲养员提供一个喂养动物的方法,用于喂养动物
没有多态, 针对不同类型的动物,我们要提供不同的feed方法来喂食,非常繁琐,不够简洁。
那怎样才能只提供一个方法就可以统一喂养所有动物?
这就是多态的好处
把不同的子类对象当做父类类型来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码的代码达到通用编程,以适应需求的不同变化、
提高了代码的扩展性
二、多态的转型
1.向上转型
l当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
2.向下转型
一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
运行报错,因为我们无法将猫转换成狗
那什么时候使用向上转型呢?
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。
如:Animal a = new Dog();
a.eat();
l什么时候使用向下转型?
当要使用子类特有功能时,就需要使用向下转型。
如:Dog d = (Dog) a; //向下转型
d.lookHome();//调用狗类的lookHome方法
l向下转型的好处:可以使用子类特有功能。
弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。
那怎么解决这个弊端呢?
3.instanceof关键字
当发生以上这种情况时,我们就需要用到instance of这个关键字
instanceof 判断对象是否是某一个类的实例
* 语法格式: boolean b= 对象A instance of 类B
* 判断A对象是否是B对象的实例