Java多态详解

目录

1.为什么使用多态

2.实现多态

2.1 多态的基本概念

2.2 多态的两种形式

2.2.1 子类到父类的转换(向上转型)

2.2.1.1 向上转型语法

2.2.1.2 向上转型的规则

2.2.2 父类到子类的转换(向下转型)

2.2.2.1 向下转型的特点

2.2.2.1 向下转型的语法

2.3 实现多态的形式

2.3.1 使用父类作为方法形式参数实现多态

2.3.2 使用父类作为方法返回值实现多态

2.4 instanceof运算符

2.4.1 instantceof的语法

2.4.2 instantceof的作用

2.4.3 使用instantceof需注意

3.多态的优势

4.面向对象三大特性优点


使用工具IntelliJ IDEA Community Edition 2023.2.4

使用语言Java8/JDK1.8

1.为什么使用多态

多态:指不同对象接受到同一消息是会产生不同的行为(一个接口,多个方法);
        简单来说,就是在同一个类或继承体系结构的基类(父类)和派生类(子类)中,使用同名函数来实现不同的功能。

2.实现多态

2.1 多态的基本概念

简单来说,多态是具有表现多种形态的能力的特征。在程序设计的术语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且能自动地调用引用对象的方法,也就是根据作用到的不同对象类型,响应不同的操作;

子类可以分别对父类的方法进行重写,因此调用时表现出不同的形态。从这里也可以看出,多态性与继承方法重写密切相关。

2.2 多态的两种形式

2.2.1 子类到父类的转换(向上转型)

2.2.1.1 向上转型语法

<父类型> <引用变量名> = new <子类型>();//通常叫做父父new子,就是向上转型的语法;

2.2.1.2 向上转型的规则
  1. 将一个父类的引用指向一个子类对象被称为向上转型,系统会自动进行类型转换;
  2. 通过父类引用变量调用的方法是子类重写或继承的子类方法,不是父类的方法;
  3. 通过父类引用变量无法调用子类特有的方法(就是无法调用子类创建的的方法,只能调用重写或继承的方法);

2.2.2 父类到子类的转换(向下转型)

2.2.2.1 向下转型的特点

之前有提到过,当向上转型发生后,将无法再调用子类特有的方法;如果想调用子类特有的方法,可以把父类转换为子类。这是另一种实现多态的方式。将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,这被称为向下转型,此时必须进行强制类型转换,通过强制类型转换,将父类类型转换为它的某个子类类型,然后才能调用其子类特有的成员,也能调用子类继承或重写的方法。

2.2.2.1 向下转型的语法

<子类型> <引用变量名> = (子类型) <父类的引用变量(父类指向子类的那个对象名)>;//通常叫做子子子父,就是向下转型的语法;

2.3 实现多态的形式

2.3.1 使用父类作为方法形式参数实现多态

使用父类作为方法形式参数的方式,是Java中实现和使用多态的主要方式之一。

在以上代码中,如代码第一,第二,第三所示,在把实参赋给形式参数的过程中涉及了父类和子类之间的类型转换。例:执行"Crop cropOne=new AppleTree("富士")"后,当调用"landOne.plant(cropOne);"时会执行"cropOne.print();"这时调用的是cropOne对象真实引用的对象(AppleTree类的对象)重写或继承的print()方法。

使用父类作为方法的形式参数实现多态具有明显优势,不仅可以减少代码量,而且可以提高代码的可扩展性和可维护性,通过使用继承和多态机制,扩展变得非常容易

2.3.2 使用父类作为方法返回值实现多态

除使用父类作为形式参数实现多态外,Java还提供另一种实现和使用多态的方式——使用父类作为方法返回值实现多态。

可以用返回的对象赋值给那边运行类的对应对象

2.4 instanceof运算符

  • 通过父类到子类的向下转换可以实现多态,即执行不同子类中定义的特有方法。但事实上,父类对象的引用可能指向某一个子类对象,如果在向下转型时没有转换为真实的子类类型,就会出现转换异常("ClassCastException"异常),就是父类指向的子类不是对应的子类,就会出现编译错误。
  • 那么,如何通过代码避免这种异常的发生呢?Java提供了instantceof运算符来进行类型的判断。

2.4.1 instantceof的语法

if(对象 instanceof 父类或接口){

        ((需要转换的子类名)父类对象)...
}

2.4.2 instantceof的作用

该运算符用来判断一个对象是否属于一个类或实现了一个接口,结果为true或false。在强制类型转换之前通过instanceof运算符检查对象的真实类型,在进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。

2.4.3 使用instantceof需注意

在使用instanceof运算符时,需要注意的是:对象的类型必须和instanceof参数后所指定的类或接口在继承树上具有上下级关系;否则,会出现编译错误

3.多态的优势

  1. 可替换性:多态对已存在的代码具有可替换性
  2. 可扩充性:多态对代码具有可扩充性。新增子类不会影响已存在类的各种性质
  3. 灵活性:多态在程序中体现了灵活多样的的操作,提高了使用效率(重载函数,重写函数)
  4. 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要

4.面向对象三大特性优点

  • 面向对象的三大特性:封装、继承、多态
  1. 封装就是声明类的成员变量为私有的,同时提供公有的方法实现对该成员变量的存取操作。
  2. 继承是软件可重用性的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法充实自身内容,这种现象或行为被称为继承。
  3. 多态是具有表现多种形态的能力的特征。在程序设计的话语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且能自动地调用引用的对象的方法,也就是根据作用到的不同的对象类型,响应不同的操作
  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值