前言

刚开始学Java的时候对多态这个概念一直没弄太明白,随着后面的学习无意中都在用着多态,又看了一些文章决定整理一下!

参考文章:
https://www.cnblogs.com/zhai1997/p/12416447.html

举例

创建一个Person类,Student类继承Person类,并分别创建子类特有、父类特有、子类和父类共有的方法。

Person类

public class Person {private String name;private Integer age;public void eat(){System.out.println("我饿了!");//子类和父类共有的方法}public void tired(){//父类特有的方法System.out.println("我累了!");}
}

Student类

public class BoyStudent extends Person {public void eat(){//子类和父类共有的方法System.out.println("我要吃饭!!");}public void study(){//子类特有的方法System.out.println("我正在学习!!");}
}public class GirlStudent extends Person {public void eat(){//子类和父类共有的方法System.out.println("我要吃饭饭!!");}public void study(){//子类特有的方法System.out.println("我正在学习习!!");}
}

测试类

public class Test {public static void main (String [] args){Person person=new BoyStudent();person.eat();person.tired();((Student) person).study();}
}

(1)形式上:父类的引用指向子类的对象。例如:

Person person=new Student();

Person person为父类的引用,后面为具体的子类

在jvm虚拟机中大概是这样的:

(2)当调用子类和父类共有的方法的时候,会执行子类重写后的方法

(3)当调用父类特有的方法的时候会执行父类的方法。

(4)当调用子类的特有的方法的时候要向下转型,否则,是无法调用子类的特有的方法的。

缺点:

它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的。

对多态的理解

  • 接口的多种不同的实现既为多态。

  • 将父类对象设置为一个或更多个子类对象(前面为父类对象,new 后面的为子类对象)

Person person=new BoyStudent();
Person person=new GirlStudent();
Person person=new ...Student();
Person person=new ...Student();
...
  • 程序中定义的引用类型的变量调用的方法在编程的时候并不确定,当处于运行期间才确定(编译看左边,运行看右边)。这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。
public class Worker extends Person {public void eat(){System.out.println("我饿了,我要吃饭!!");}public void  work(){System.out.println("今天继续搬砖!!");}
}
public class Student extends Person {public void eat(){System.out.println("我要吃饭!!");}public void study(){System.out.println("我正在学习!!");}
}

也就是说,在定义父类的引用的时候运行的时候就可以指向两种不同的对象,调用eat方法后就会产生不同的效果,也就是说用同样的对象调用同样的方法但是做了不同的事情。

三要素

继承或接口实现(先决条件,没有继承就不会有子类对父类方法的重写)

重写(不同的子类对父类的方法进行重写之后才会体现父类的引用的多态)

父类引用指向子类对象(这是多态的具体实施)

例如:创建一个Person类作为父类,学生类和教师类作为子类。将学习作为子父类的公共的方法,子类可以重写父类的方法并且可以有自己特有的方法。父类的引用指向子类对象,此时,父类的引用只能调用父类特有的方法或者子父类共有的字类重写后的方法,调用子类特有的方法的时候需要向下转型。

多态的体现

Set <Student> students=new HashSet<Student>();
students.add(stu1);Set<Student> students1=new LinkedHashSet<Student>();
students1.add(stu2);

HashSet类和LinkedHashSet类都实现了同一个接口Set,在上面的程序中,Set接口的引用,分别指向了不同的对象,调用名字相同但是功能不同的方法,体现出了多态。

其它

一般认为Java中的函数重载是一种静态多态,因为他需要在编译期决定具体调用哪个方法。而重写是只有在运行时期确定到底运行哪一个子类中的方法

Javase多态(对多态的理解、多态的体现)相关推荐

  1. 关于java多态中覆盖的理解

    在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...

  2. python多态_Python基础入门18节-第十六节 面向对象如何理解多态

    多态是面向对象的一大特性,Python本身也是一门多态性的语言.在Python中要实现多态,还是得借助于上节提到的继承. 假设有这么一个场景,在夏季我们可以看到荷花.牡丹花.太阳花,夏天一到这些花全都 ...

  3. 深入.NET平台和C#编程笔记 第七章 深入理解多态

    第七章 深入理解多态 1.里氏替换原则: 在一个软件系统中,如果子类出现在父类出现的位置,而整个软件功能又没有影响,那么咱们称为里氏替换. 父类变量指向子类对象!! 2.Is 和as Is 做类型判定 ...

  4. JavaSE基础知识(十八)--Java多态之向上转型(多态初步)

    Java SE 是什么,包括哪些内容(十八)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 开篇一句很重要的话:在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种 ...

  5. 程序员应如何理解多态

    面向对象编程领域有个非常重要的概念,那就是多态,但是你真的理解这到底是什么意思吗?程序员该如何理解多态? 英文中的多态 多态一词其英文为"polymorphism",在讲解多态之前 ...

  6. 温故知新:面向对象--多态(深入理解“多态”)

    文章目录 多态的定义 实现场景 转型 多态与前后绑定 多态与设计模式的几大原则 面向对象的三大特性:多态.封装.继承 多态的定义 多种体现形态. 即:一个函数,多种实现. 实现场景 A.重写 A1.父 ...

  7. java继承和多态_Java基础继承与多态

    Java基础第九天 继承概述 引入 首先我来写两个代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15//定义学生类 class Student { public void  ...

  8. C++ 面向对象(二)多态 : 虚函数、多态原理、抽象类、虚函数表、继承与虚函数表

    目录 多态 多态的概念 多态的构成条件 虚函数 虚函数的重写 协变(返回值不同) 析构函数的重写(函数名不同) final和override final override 重载, 重写, 重定义对比 ...

  9. java三大特性之多态的认识,以及多态的实际应用(一)

    首先,什么是多态? 我们应该从什么角度来理解多态?其实,我们不妨把多态理解成一种事物的多种存在形态, 比如,猫和狗都属于动物的子类,可以想象成为动物,而动物又可以变成猫和狗. 多态是将子类对象当作__ ...

  10. java多态的概念_java中多态是什么?概念详解

    对于java中的多态你是怎样理解的呢?很多人表示,自己对于多态的概念不是很清楚,那么下面就让我们一起来详细的了解一下吧. 1.什么是多态? 多态简单的来说就是一种事物的多种存在形态. 在面向对象语言当 ...

最新文章

  1. struts2 标签的使用之二 s:iterator
  2. 瑞斯康达nms_瑞斯康达接入网设备维护手册免费.pdf
  3. c盘java文件误删_java获取C盘下的隐藏目录文件名称
  4. java excel 操作方式_Java读写Excel基本操作
  5. 从0到1构建支撑企业自动化运维体系
  6. [C/C++] gdb 调试
  7. Windows程序设计:使用VS2010创建窗口程序
  8. UltraEdit v17.00.0注册机
  9. PS 画笔工具与文字工具
  10. 职场通病之 - 眼里揉不得沙子
  11. 1月书单 2月新书预告 | 百万册畅销书全新续作来啦
  12. 好看的照片要怎么拍?
  13. 第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
  14. 计网day12 奈氏准则和香农定理
  15. Jzoj5454【NOIP2017提高A组冲刺11.5】仔细的检查
  16. 什么是RPN,ROIAlign?
  17. html中鱼眼效果,鱼眼效果和放大效果怎么做
  18. Mysql table_definition_cache
  19. kali 安装中文中文输入法(一遍成功无错误)
  20. 利用stm32和PC做一个示波器

热门文章

  1. Linux命令详解:md5sum
  2. android10桌面布局好看,让你的Android手机界面布局更好看
  3. 2022杭电多校八 1011-Stormwind(贪心)
  4. java图形界面计算器_java图形界面 计算器实现
  5. 五分钟学会python函数_Python——带你五分钟了解函数式编程与闭包
  6. 数据结构——栈的应用
  7. Django分页组件
  8. visual stdio 2015社区版、专业版的下载
  9. JS 封装一个判断闰年平年的方法 aa(nian)
  10. JVM系列:JIT技术概述