目录
使用工具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 向上转型的规则
- 将一个父类的引用指向一个子类对象被称为向上转型,系统会自动进行类型转换;
- 通过父类引用变量调用的方法是子类重写或继承的子类方法,不是父类的方法;
- 通过父类引用变量无法调用子类特有的方法(就是无法调用子类创建的的方法,只能调用重写或继承的方法);
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.多态的优势
- 可替换性:多态对已存在的代码具有可替换性
- 可扩充性:多态对代码具有可扩充性。新增子类不会影响已存在类的各种性质
- 灵活性:多态在程序中体现了灵活多样的的操作,提高了使用效率(重载函数,重写函数)
- 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
4.面向对象三大特性优点
- 面向对象的三大特性:封装、继承、多态
- 封装就是声明类的成员变量为私有的,同时提供公有的方法实现对该成员变量的存取操作。
- 继承是软件可重用性的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法充实自身内容,这种现象或行为被称为继承。
- 多态是具有表现多种形态的能力的特征。在程序设计的话语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且能自动地调用引用的对象的方法,也就是根据作用到的不同的对象类型,响应不同的操作