在讲述向上转型和向下转型之前,我们先简单讲解下多态,如果后续看了有关多态的讲解还是不弄,只能自己上网去查阅和理解.
多态概念:
多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
比如,你的女盆友让你买点水果回来,不管买回来的是苹果还是西瓜,只要是水果就行,这个就是生活中多态的体现
再比如,小猫、小狗、小猪我们都可以把它们叫成小动物.每种小动物都需要吃东西,所以我们可以统一设置他们都必须吃,但是每种小动物的习性不一样,吃东西也不一样.所以每一种动物吃东西不同,也是动物吃东西的一种多态体现.
多关多态的讲解就到这了,下面我们开始讲向上、向下转型
一、向上转型:
首先我们先按照最常规的方式声明一个对象并赋值,等号左边是类型声明,等号右边是对象实例
Animal animal = new Animal();
这时等号两边都是同一类型.
我们变化一下,将等号右边改为等号左边的子类
Animal animal1 = new Dog();
Animal animal2 = new Cat();
这种将子类对象赋值给父类类型的操作就是向上转型,也就是我们常说的父类引用指向子类的对象
因为符号is-a原则,这样写没什么问题.
在日常开发中,我们会大量使用向上转型,这样能发挥多态的特性
除了这种显式的转型,还有在很多时候默认发生向上转型
比如我们将参数声明为父类类型,别人在传参的时候传的是子类对象,这也属于向上转型
public static void eat(Animal animal){
// ...
}
public static void main(String[] args){
eat(new Dog());
eat(new Cat());
}
二、向下转型
向下转型就是反过来,将父类对象实列赋值给子类的声明,在java编译中,直接这样做肯定会编译报错,
Animal animal = new Dog();
Dog dog = animal;//编译会报错,此时animal代表父类实例
因为这不符合is-a原则,所以我们必须加一个括号,括号作用将对象强制转换成指定类型
Animal animal = new Dog();
Dog dog = (Dog)animal;
Cat cat = (Cat)animal;
强制类型转换虽然可以通过编译,但是有可能在运行时转换失败抛出异常.
所以为了保证向下转型成功,我们可以通过instanceof操作符来判断对象实例是否属于某种类型
Animal animal = new Dog();
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.eat();
}
if(anmal instancfof Cat cat){
cat.eat();
}