java理解向上转型和向下转型

在讲述向上转型和向下转型之前,我们先简单讲解下多态,如果后续看了有关多态的讲解还是不弄,只能自己上网去查阅和理解.

多态概念:

多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。

比如,你的女盆友让你买点水果回来,不管买回来的是苹果还是西瓜,只要是水果就行,这个就是生活中多态的体现

再比如,小猫、小狗、小猪我们都可以把它们叫成小动物.每种小动物都需要吃东西,所以我们可以统一设置他们都必须吃,但是每种小动物的习性不一样,吃东西也不一样.所以每一种动物吃东西不同,也是动物吃东西的一种多态体现.

多关多态的讲解就到这了,下面我们开始讲向上、向下转型

一、向上转型:

首先我们先按照最常规的方式声明一个对象并赋值,等号左边是类型声明,等号右边是对象实例

Animal animal = new Animal();

这时等号两边都是同一类型.

我们变化一下,将等号右边改为等号左边的子类

Animal animal1 = new Dog();

Animal animal2 = new Cat();

这种将子类对象赋值给父类类型的操作就是向上转型,也就是我们常说的父类引用指向子类的对象

因为符号is-a原则,这样写没什么问题.

在日常开发中,我们会大量使用向上转型,这样能发挥多态的特性

java理解向上转型和向下转型_第1张图片

除了这种显式的转型,还有在很多时候默认发生向上转型

比如我们将参数声明为父类类型,别人在传参的时候传的是子类对象,这也属于向上转型

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();

}

你可能感兴趣的:(java基础,java,servlet,前端)