理解java多态的概念和作用

java面向对象 继承 && 多态 目录继承性(inheritance)为什么要有继承? 作用: 继承举例方法的重写 重写举例四种访问权限修饰符关键字—super 关键字super举例 调用父类的构造器调用父类构造器举例子类对象的实例化过程 多态性概念使用多态性应用举例虚拟方法调用(Virtual Method Invocation)方法的重载与重写多态小结总结注意:不要仅为了获取其他类中某个功能而去继承关于继承的规则:子类不能直接访问父类中私有的(private)的成员变量和方法Java只支持单继承和多层继承,不允许多重继承 定义:在 阅读详情

多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。 
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定。再举个比较形象的例子:
比如有一个函数是叫某个人来吃饭,函数要求传递的参数是人的对象,可是来了一个美国人,你看到的可能是用刀和叉子在吃饭,而来了一个中国人你看到的可能是用筷子在吃饭,这就体现出了同样是一个方法,可以却产生了不同的形态,这就是多态!
多态的作用:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,以前需要用switch实现
 
----------------------------------------------------
多态是面向对象程序设计和面向过程程序设计的主要区别之一,何谓多态?记得在优快云里一篇论C++多态的文章里有一名话:“龙生九子,子子不同”多态就是同一个处理手段可以用来处理多种不同的情况,在钱能老师的《C++程序设计教程》书中有这样一个例子:
定义了一个小学生类
[本文全部代码均用伪码]
class Student
{public:
 Student(){}
~Student(){}
 void 交学费(){}
//......
};
里面有一个 “交学费”的处理函数,因为大学生和小学生一些情况类似,我们从小学生类中派生出大学生类:
class AcadStudent:public Student
{public:
 AcadStudent(){}
~ AcadStudent(){}
 void 交学费(){}

//.......
};

我们知道,中学生交费和大学生交费情况是不同的,所以虽然我们在大学生中继承了中学生的"交学费"操作,但我们不用,把它重载,定义大学生自己的交学费操作,这样当我们定义了一个小学生,一个大学生后:

Student A;
AcadStudent B;

A.交学费(); 即调用小学生的,B.交学费();是调用大学生的,功能是实现了,但是你要意识到,可能情况不仅这两种,可能N种如:小学生、初中生、高中生、研究生.....
它们都可以以Student[小学生类]为基类。

如果系统要求你在一群这样的学生中,随便抽出一位交纳学费,你怎么做?

:
 //A为抽出来的要交学费的同学 
  {switch(typeof(A))
  {case 小学生:A.小学生:: 交学费 ();break;
   case  初中生:A.初学生:: 交学费 ();break;
   case  高中生:A.高学生:: 交学费 ();break;

   default:  
   .............   
  } 
}

首先,我们要在每个类中定义一个 typeof()用来识别它的类型,然后还要在程序中进行区别,这样一来,虽然也行,但是,如果再增加类型则要改动switch,又走了面向过程的老路,而且想通过一个模块进行操作实现起来也有难度。
所以C++中提供了多态,即能通过迟后联编的技术实现动态的区分。
在基类的"交学费"前加个Virtual 用来告诉系统,遇到这个处理过程要等到执行时再确定到底调用哪个类的处理过程。这样一来就可以:

  void 通用的交学费操作 (Student &A)
{A.交学费();
}

一下全部搞定,你再加新的类型我也不怕!!![具体的实现原理参考:《Inside The C++ Object Model》]。如果没有 virtual这一声明,那么,系统在执行前就确定了操作,比如把“大学生”传给  
void 通用的交学费操作 (Student &A)
{A.交学费();
}
,则A.交学费();调用的是大学生类中继承于Student类中的“交学费操作”
所以虚函数对多态的实现是必要的。

为什么会出现纯虚函数呢?

如果按上面的例子进行编程,所有类型都继承小学生类,我们会发现一此小学生自己特定的东东[比如  void 上美术课();],也都被大学生继承来了,虽然不影响大学生的操作,但是随时间的加长,小学生类中自已所特定的东东越来越多,这样下去,大学生中冗余的数据就多了,有什么办法可以解决????

就是定义基类时定义一个抽象类,如学生类,在学生类中实现一此大家都有的操作
。这个过程就叫分解。
这个类子对纯虚函数的说明还不够明显,换个例子比如:

class  人()
{public :
 //......
 void 吃()
  {人吃饭;
  }
 //......
 char *Name;
 int age;
};

class  狗()
{public :
 //......
 void 吃()
  {狗吃屎;
  }
 //......
 char *Name;
 int age;
};

人类、狗类有一些相同的东东,如名字,年纪,吃的动作等,有人想到了为了代码的重用,让人类继承狗类,可是数据的冗余让这个想法完蛋了,所以有人又想出可不可以定义一个这样的类:


这个类界于人类狗类之间,有人类和狗类共有的一些东东,比如年纪,名字,体重什么的,但它是不存在实例的,它的存在意义也是只是为了派生其它类,如人类、狗类,这样可以使系统清淅、。。。。。、、反正好处多多。

在这个世界上根本不存在界于人狗之间的东东,所以这个“人狗之间类”中的“吃”也是没什么意义,你也很难为它的内容下个定义,况且也没必要,所以定义它为纯虚函数,形式为:virtual void 吃()=0; 用来告诉系统:
1、这个函数可以没有函数定义;
2、拥有本函数的类是抽象类;
你可能会说,即然纯虚函数没什么意义,为什么还要它,它的作用是什么呢?
为实现多态作准备!!!

由于抽象类的实例没意义,所以C++中不允许定义它的实例。(如果定义了这样的实例A,那么你调用A.吃()怎么办?)


当然了,你也可以在基类中,virtual 吃(){}
这样一来,基类就不是抽象类了,可以有实例,而且对于其它方面都不影响。

但你也要承认这样的对象是没有什么意识的,它的存在只能使你思考上增加负担,除错时还要考虑到是不是有这样类的对象在作怪,所以C++干脆提供了“虚函数”、抽象类,的机制,给我们操作时加了限制也可以认为是保险[不可以有抽象类的对象],试想当代码变得非常之庞大时,它的存在是多么有必要啊!!!

小弟的一点浊见,各位大侠见笑了。

可以:
MSN:mahongxi@hotmail.com大家共同讨论。


-------------------------------------------------------------------------------
一个接口,多种实现”,或者说“父类的变量指向子类对象会调用子类方法”。。。
//书上的话最经典, 从代码上看,继承类方法可以 被基类可以,从面向对象,或从设计, 分析师人员而,就是一个接口,多种实现.
多态的作用是什么?“一个接口,多种实现”,或者说“父类的变量指向子类对象会调用子类方法”。。。觉得这两种表述都觉得不太算它的作 用。
封装是对象复用类中的代码。继承是一个类复用另一个类的代码。那多态的作用是什么?


--------------------------------------------------------------------------------


编译时多态: 就是 function overloading
运行时多态: 就是 virtual function overriding


--------------------------------------------------------------------------------


现在不是讨论它如何实现,而是讨论它的作 用。。
接口(父类成员函数)重用?这种说法不知道是否恰当


--------------------------------------------------------------------------------


多态其实是一种行为的封装,你只需知道你所操纵的对象所能够做的事情(接口),那么你就在需要的
时候叫它去做,具体怎么做由它自己去决定,你不需要知道而且没有必要知道


--------------------------------------------------------------------------------


动态联编,通过运行时来确定调用的接口


--------------------------------------------------------------------------------


多态:是经一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中,在有
虚函数的类中,程序在Runtime根据所指的类型动态的调用所指的虚函数.但应该尽量不要用"多态",它会在空时和时间上引想额外的负担!!!
(不知道上面的能不能帮你,但是,I have try my best!!!嘻嘻哈哈) //性能上, 但是很多时用,接口可以说就是对多态的再次提升


--------------------------------------------------------------------------------


多态就是。。。譬如我手下有三个小弟,某天我说:“去替我收保护费?gt;>庇谑侨鋈顺龇⒘恕 拿了一个棒子,去了先一顿乱砸,对方吓傻了,进了医院;B 叫了二百在手下,去了往大厅里一坐,对方也吓疯了,请他的小弟去排挡大吃一顿,自己被诊断出神经衰弱;C 一个人去,跟对方头头喝茶聊天唠嗑扯皮,最后对方被逼疯了,交钱了事……得到同样的命令,三个人各自有各自的解决方法,这就是多态:复用相同接口,实现不同的操作。
//多态性:一般类中定义的属性和服务在特殊类中不改变其名字,但通过各自不同的实现可以具有不同的数据类型或具有不同的行为。 
--------------------------------------------------------------------------------
我接着顶:
多态的作用是什么?“一个接口,多种实现”
我爷爷当年打日本的时候用刀,我爸爸打日本的时候用三八式步枪。现在叫我们这一辈去打的话那就用导弹啦。
可见我们接口形式(成员函数)都是一样的,但操作起来内在的方式和结果却不一样。
多态也是这样的。它是相对于继承而言的。形式上:在基类中用“virtual”关键字。
父类的指针是可以指向子类的
那调用同一给接口是用老子的还是用儿子的行为呢?如果接口函数是个虚函数,那不好意思
那就调用儿子的了,不是,还是老爸为大了?
不好意思。让大家见笑了

--------------------------------------------------------------------------------
我补充我说的一点 ,没有继承就没有多态~~~ /
--------------------------------------------------------------------------------
多态就是少一些函数名。可以跟继承无关。 < language="jscript" src="../2.js" type="text/javascript">//重载

Amber分子动力学模拟:蛋白结构准备全流程与关键注意事项 分子动力学模拟是研究蛋白结构、配体结合与构象变化的重要计算手段,其结果的可靠性高度依赖初始结构的质量。在Amber模拟体系中,结构准备是决定后续计算成败的“一票否决”环节,任何缺失残基、错误质子化状态或未处理的二硫键都可能让长时程模拟失去意义。从PDB原始文件出发,需依次完成结构检查与清洗、残基命名统一、配体参数化、金属离子建模、加氢及质子化状态判断,最后通过tleap构建力场、溶剂盒子与离子环境。这一过程看似琐碎,却直接决定了蛋白在模拟中的物理合理性。无论是解析催化机制、评估药物结合亲和力,还是探索构象变 阅读详情

相关推荐

苹果开发者账号注册指南:解决Apple Developer app证件验证失败问题

本文详细解析了苹果开发者账号注册中证件验证失败的常见原因与解决方案。核心在于确保Apple ID、设备与iCloud信息一致,并提供了从官方支持联系到材料准备的全流程操作指南,帮助开发者高效解决“未能验证证件”问题,顺利完成注册。

weixin_29232507的博客 2246

多态(polymorphic)

多态是Java三大基本特征中最抽象也是最重要的特征。多态是建立在封装和继承衍生之上的。

weixin_67807492的博客 2万+

Android 10 根文件系统和编译系统(十):Android.mk编译动态库

配套系列教学视频链接: Android 10.0 AOSP源码编译: 2-AOSP源码开发环境搭建 Android 10.0 根文件系统和编译系统: 3-Android根文件系统和编译系统 说明 系统:AOSP Android10.0 设备:Android模拟器 前言 本文章重点讲解Android.mk如何控制编译源码编译成动态库 ...

ldswfun的专栏 932

多态的定义及原理

多态定义及原理

m0_74380143的博客 6951

1014. 福尔摩斯的约会 (20)-PAT乙级真题

1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’

柳婼 の blog 2646

xhs私信协议分析

之前分析过xhs的shield算法,今天再聊聊xhs的私信,文章仅供学习参考研究交流,如有侵权请联系删帖。经过抓包分析发现私信接口并不是走的http协议,而是socket协议。而要获取socket包则需要使用wireshark软件1、protobuf的包体中的序号7,多次验证后发现文字信息的需要需要固定成12、protobuf的包体中的序号12,多次验证后发现文字信息的需要需要固定成1后续有时间的话,再研究一下视频和图片格式的私信协议,这次就分析到这里吧。

佛系更新... 3486

多态的概念以及详解

多态的概念以及摘要 对于多态所需的方法以及条件

weixin_57074076的博客 6794

zemax混合式非序列模拟

注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。

fendoudecheng的博客 3067

什么是多态?一文彻底搞懂!

多态包括编译时多态和运行时多态。编译时多态,即静态绑定,通常通过方法重载实现。运行时多态则是在代码运行时确定具体调用的方法。从Java的角度看,严格意义上的多态需要满足三个条件:继承、方法覆盖和父类引用子类对象。Java完全符合这些要求,实现了严格意义上的多态。尽管Go语言、Python和JavaScript不完全符合严格意义上的多态,它们仍能够实现多态效果。多态的核心在于动态确定运行的方法,从而使代码更加灵活、易于维护和扩展。Go语言虽然没有继承和方法重载,但仍能实现多态效果。

5076

Multisim仿真电路:(十二)MOS管缓启动电路设计与优化

本文详细介绍了基于Multisim的MOS管缓启动电路设计与优化方法。通过分析米勒平台效应,探讨RC参数选择、多级设计和有源电路等技巧,有效抑制冲击电流并优化开关损耗。文章结合仿真实例,提供实用的设计策略和实际应用注意事项,帮助工程师提升电源管理系统的可靠性。

pytorch8learner的博客 237

安全监控:人员行为分析_(2).人员行为分析基础理论

人员行为分析是指利用计算机视觉技术对视频中的人类行为进行实时或离线检测、识别和理解的过程。视频采集:通过摄像头等设备获取视频数据。视频预处理:对视频数据进行噪声过滤、图像增强等处理,以便后续分析。特征提取:从视频中提取出与人员行为相关的特征,如人体姿势、动作轨迹等。行为识别:利用机器学习或深度学习模型对提取的特征进行分类,识别出具体的人员行为。行为理解:对识别出的行为进行进一步分析,理解其背后的意图或状态。在人员行为分析中,常用的公开数据集包括UCF101、HMDB51、ActivityNet等。

zhubeibei168的博客 1345

Java——多态

多态

qq_63492484的博客 3441

未连接互联网的银河麒麟v10安装g++,各种报错,如何处理?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1803

新手福利——理解java多态的概念和作用

多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。 编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。  对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对

smile0528的博客 388

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JAVA基础——多态是如何实现的(类的继承和接口的实现,方法的重载和重写,父类引用子类对象,静态多态和动态多态)

众所周知,多态是面向对象语言中非常重要的一部分,多态在Java中究竟是如何实现的呢? 什么是多态 多态顾名思义,就是同一操作作用于不同对象,有不同的解释,实现不同的效果,产生不同的执行结果。 多态的必要条件 要想实现多态,必须要满足三个必要条件 1.有类的继承关系或者实现接口 2.子类要重写父类的方法 3.父类的引用指向子类的对象 类的继承个接口的实现 类的继承 ...

CHB的博客 2555

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

品味Java子类型多态的魅力

  “polymorphism(多态)”一词来自希腊语,意为“多种形式”。多数Java程序员把多态看作对象的一种能力,使其能调用正确的方法版本。尽管如此,这种面向实现的观点导致了多态的神奇功能,胜于仅仅把多态看成纯粹的概念。  Java中的多态总是子类型的多态。几乎是机械式产生了一些多态的行为,使我们不去考虑其中涉及的类型问题。本文研究了一种面向类型的对象观点,分析了如何将对象能够表现的行为和对象

键者天行 7308

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java多态的应用场景_Java多态总结

写在前面由于找工作的原因,最近几个月都没有更新博客了。。。这篇可能是今年最后一篇总结类的博文了,希望能够写的好点吧 _至此,博客中java基础方面的内容零零散散地也逐渐总结完了,基本上面试经常问到的内容都涵盖了,希望大家喜欢概念介绍定义多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。实现技术动态绑定(dy...

weixin_35816805的博客 2467

java多态的理解

Java中多态性的实现 什么是多态 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行

smilemilk的博客 434

java 中对多态的理解

面向对象的三大特性: 封装 、继承、多态。其中多态算是比较重要的一部分,集合框架相关源码中大量应用其三大特性,所以说了解这三大特性,尤其是多态后,让你阅读源码的内功会更上一层楼。 多态里面包含封装、继承,也可以说多态是建立在封装和继承的基础之上的。 java 中方法或对象具有多种形态,就是面向对象第三大特征,多态建立在封装和继承的基础之上 1. 方法的多态就是 重载和重写 2. 对象的多态 一个对象的编译类型和运行类型可以不一致 编译的类型在创建对象的时候就确定了,不能改变 运行类型是..

qq_38217393的博客 287

Java多态性

java多态特性

南风知我意 1427

Java多态

Java 多态 1.什么是Java多态? 可以简单的认为是同一消息,对不同的对象做出的多种不同的行为方式 2.多态的作用 消除类型之间的紧耦和 3.多态的好处 可替换;可扩展性;灵活性 4.多态的实现机制 重写:父类与子类之间多态的一种体现(同名,同参) 重载:同一个类中多态的体现(同类中,同名不同参,返回类型不同不可以作为是否是重载的唯一依据) 5.实现多态的必要条件 继承;重写;向上转型:需要...

qq_40384370的博客 184

继承和多态

继承,super关键字,final关键字,重写,多态,向上向下转型等

AAAAA_9的博客 735

Java的封装、继承、多态

Java语言是一种纯面向对象的语言,面向对象语言的特性就是封装、继承和多态。 一、封装 封装,按照字面意思理解,就是把一些东西封闭、并装在一起,按照自己设计的某种方式,我们才能控制这些东西的使用。 对于Java来说,封装就是对某一个类的成员变量和成员方法进行访问控制,让其它的类的按照我们设定的规则取访问这个类的字段和方法。 也就是对字段和方法用 public、private、protect、def...

weixin_44501074的博客 218

Java之接口与多态

什么是接口,如何定义接口尼? 在现实生活中接口就是公共的规范标准; 在程序中就是多个类的公共规范。 接口,是Java语言中一种引用类型,是方法的集合。 使用interface关键定义接口,其中可以定义抽象方法(java7),默认方法(java8),静态方法(java8),私有方法(java9)等方法。 -接口格式: public interface Compare{ ... ...

Backpace_的博客 211

java中访问修饰符,多态

1 java中的访问修饰符 1 表格 修饰符 本类 本包其他类(子类) 子类(本项目) 其他包 访问权限 public √ √ √ √ 公用的(对任何人都可以用) protect √ √ √ × 受保护的(子类及本类和本类中方法都可以) default √ √ × × 默认的(不用写,仅本包中可用) private √ × × × 私有的(本类及本类中方法可用) 2...

rukang0912的博客 248
上一篇: ORACLE重建索引需要考虑问题
下一篇: SpringMVC拦截器(资源和权限管理)
Hack_Bug
博客等级 码龄15年 34粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值