概念:同一个类实例的相同方法在不同情形下有不同的表现形式

在Java中,对于多态的核心表现主要有以下两点:

1. 方法多态:

① 方法重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体

② 方法覆写:同一个父类的方法可以根据实例化子类的不同也有不同的实现

方法多态之前的文章里面详细阐述过,在此不再赘述。

2. 对象多态:

① 向上转型(90%):

天然发生,认爹过程,指的是将子类对象变成父类对象

语法:父类 父类引用 = 子类实例;,例如Person per = new Student();

class Person {public void print() {System.out.println("父类");}
}
class Student extends Person {public void print() {System.out.println("子类");}
}
public class XiangShangZhuanXing {public static void main(String[] args) {Person per = new Student();per.print();}
}

  • 结论:不管是否发生了向上转型,核心本质还是在于:你使用的是哪一个子类(new在哪里),而且调用的方法是否被子类所覆写了。

应用场景:参数统一化

例如:要求定义一个方法,这个方法可以接收Person类的所有子类实例,并调用Person类的方法。

class Person {public void print() {System.out.println("1.我是人类!");}
}
class Student extends Person {public void print() {System.out.println("2.我是学生!");}
}
class Worker extends Person {public void print() {System.out.println("3.我是工人!");}
}
public class CanShuTongYiHua {public static void main(String[] args) {//Person per = new Student();WhoYouAre(new Student());//Person per = new Worker();WhoYouAre(new Worker());}public static void WhoYouAre(Person per) {per.print();}
}

② 向下转型(1%):

需要强转,指的是将父类对象变成子类对象

语法:子类 子类实例 = (子类)父类实例;,例如Student stu = (Student) per;

  • 问题:向下转型存在的意义或者为什么我们需要向下转型?
class Person {public void print() {System.out.println("父类");}
}
class Student extends Person {public void print() {System.out.println("子类");}public void fun() {System.out.println("只有子类有");}
}
public class XiangXiaZhuanXing {public static void main(String[] args) {Person per = new Student();per.print();System.out.println("==========");Student stu = (Student) per;stu.fun();}
}

  • 结论:在上述代码中父类能调用的就只有本类定义好的方法,并没有Student类中的fun()方法,如果父类要想调用fun()方法就只能进行向下转型处理,总的来说就是当需要子类扩充操作的时候就要采用向下转型。

应用场景:发生在父类引用需要调用子类扩充方法时,才发生向下转型变为子类引用调用其扩充方法

注意:并不是所有的父类对象都可以向下转型 ,如果要想进行向下操作之前,前提是一定要首先发生向上转型,否则在转型时会出现ClassCastException(运行时异常,类型转换异常,发生在两个毫无关系的两个类之间的强转时)

观察错误转型:

class Person {public void print() {System.out.println("父类");}
}
class Student extends Person {public void print() {System.out.println("子类");}public void fun() {System.out.println("只有子类有");}
}
public class XiangXiaZhuanXing {public static void main(String[] args) {Person per = new Person();per.print();System.out.println("==========");Student stu = (Student) per;stu.fun();}
}

  • 结论:上述代码进行向下转型之前Person per = new Person();没有先进行向上转型,所以出现类型转换异常这个错误。
  • 问题 :如果向下转型存在安全隐患,那么如何转型才靠谱呢?

最好的做法就是先进行判断,而后再进行转型,那么就可以依靠关键字instanceof实现。

引用对象 instanceof 类:表示该引用能指向该类,返回true表示可以指向,返回flase表示不能指向。

因此,向下转型的标准格式为:

if(!(per instanceof Student)) {per = new Student();   // 先建立起联系
}
Student stu = (Student) per;

观察instanceof操作:

class Person {public void print() {System.out.println("父类");}
}
class Student extends Person {public void print() {System.out.println("子类");}public void fun() {System.out.println("只有子类有");}
}
public class XiangXiaZhuanXing {public static void main(String[] args) {Person per = new Person();//避免ClassCastExceptionif(!(per instanceof Student)) {per = new Student();}Student stu = (Student) per;stu.fun();}
}

  • 结论:我们可以看到加上instanceof之后就算没有先向上转型,向下转型依然是可以进行的。
总结:
  • 对象的多态性(向上转型或向下转型)本质在于方法的覆写。
  • 通过对象的向上转型可以实现接收参数的统一,向下转型可以实现子类扩充方法的调用(一般不操作向下转型,有安全隐患)。
  • 两个没有关系的类对象是不能够进行转型的,一定会出现ClassCastException。

Java中多态的表现形式相关推荐

  1. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

  2. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  3. java中多态_java之多态

    1.多态的概述:是面向对象的三大特性之一,封装.继承.多态. ①一个具体的对象有多种形态,老虎既属于猫科动物(因为子父类是相对的,所以猫科动物也可以看做子类),又属于哺乳动物,所以老虎既可以拥有猫科动 ...

  4. JAVA中多态的理解

    Java中多态的理解 JAVA中的多态可以简单的理解为一种事物的多种形态,当然多态是在继承的基础上有重写才存在. 标题如何理解一种事物的多种形态? 举个例子,拿人类.男人.女人来说.男人.女人.都分别 ...

  5. 什么是多态,JAVA 中多态的实现机制

    什么是多态,JAVA 中多态的实现机制 首先声明啊,这里的多态不是生物学和物理学上的多态性,这个是指编程语言中的多态. 官方说明: 多态(英语:polymorphism)指为不同数据类型的实体提供统一 ...

  6. Java中多态的使用

    1.面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 2.多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息 ...

  7. java中多态到底是什么_java中的多态是指什么

    java中的多态是指什么 发布时间:2020-06-28 09:59:19 来源:亿速云 阅读:119 作者:Leah java中的多态是指什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希 ...

  8. java对多态的理解_对于Java中多态的理解

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个 ...

  9. java中多态案例工厂类,Java中构造器内部的多态方法的行为实例分析

    本文实例讲述了Java中构造器内部的多态方法的行为操作.分享给大家供大家参考,具体如下: 这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况.在此之前,我们需要 ...

最新文章

  1. python调用shell命令-python中执行shell命令的几个方法小结
  2. 方舟服务器建家位置,《方舟 生存进化》最佳建家位置,新手玩家根本无法想象!...
  3. php 比较数组中的元素,php – 比较多维数组中的元素
  4. 对于PHP框架的简单认识
  5. SAP Spartacus cxOutlet里的元数据存储,outlet名称和待渲染Component的映射关系
  6. 如何玩转小程序+公众号?手把手教你JeeWx小程序CMS与公众号关联
  7. java的学习步骤方法书籍大总结
  8. [Spark] Yarn local-dirs are bad 导致节点处于不健康状态
  9. 【Java习作】KWIC模拟
  10. vue axios 简单封装以及思考
  11. 【回顾】推荐系统的十二大评价指标总结
  12. 重大改革!Python将被加入高考科目!
  13. Default Folder X几个小技巧分享
  14. idea社区版已经足够强大了
  15. 前端学习笔记-JS数据类型
  16. 计算机网络管理(第二版)自学教程
  17. kali 改root_linux切换到root用户,kali怎么切换root身份运行
  18. scss exceeded maximum budget. Budget 4.00 kB was not met by 130 bytes with a total of 4.13 kB.
  19. 【Unity3D日常开发】灯光系统,太阳光晕效果实现
  20. [ABAP] PBOM历史版本函数展开 CSAP_MAT_BOM_READ

热门文章

  1. 经典SQL学习笔记 (二)-单行函数
  2. MPI聚合通信之MPI_Bcast函数
  3. php 漏洞 怎么解决,php安全漏洞怎么修复?
  4. oCPC和CPC之间的区别
  5. .net core借助sendCloud实现邮件验证码发送
  6. 树莓派用root登陆_树莓派开启root用户权限
  7. (转载)shell脚本中的 EOF 是什么意思?
  8. xdm,外包能干吗?
  9. 51单片机串口通信控制LED(hex)
  10. 用户反馈驱动抖音产品体验优化实践