没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2010-08-16 09:55:31.000|阅读 756 次
概述:该文内容为本人学习Java核心编程第七版时做的学习总结以及一些理解,介绍多态与动态绑定。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
该文内容为本人学习Java核心编程第七版时做的学习总结以及一些理解,部分内容为翻译过来的。 1. 多态(polymorphism) 在面向对象的编程里面,多态是一个出现频率比较高的术语,那么多态到底是指什么 呢?一个对象变量(objectvariable,与基本数据类型的变量相对应)可以指向(referto)多个类型的对象,这就是多态。以下面的代码为例:
publicclassPolymorphicTest{
publicPolymorphicTest(){
}
publicvoidsetName(Stringn){
this.name=n;
http://www.mscto.com
System.out.println(“在父类中”);
} publicStringgetName()
{
returnthis.name;
}
privateStringname;
}
publicclassPolymorphicChildextendsPolymorphicTest{
publicvoidsetArea(Stringa){
this.area=a;
}
publicStringgetArea(){
}
//publicvoidsetName(Stringn){
// super(“n”);
// System.out.pirngln(“在子类中”);
// } publicstaticvoidmain(String[]args){
PolymorphicChildchild=newPolymorphicChild();
PolymorphicTesttest[]=newPolymorphicTest[2];
test[0]=child;
test[0].setName(“zhukai”);
test[1]=newPolymorphicTest(); http://www.mscto.com
}
privateStringarea; http://www.mscto.com
}
test[0]声明为一个PolymorphicTest的变量,但是它可以referto一个PolymorphicChild类型的对象(如child),当然它也肯定可以referto一个PolymorphicTest类型的对象,因为它本身就是这个类型的,例如test[1]。为什么会这样呢?一般来说,一个对象变量可以指向(referto)任意一个它自己所属类型及其子类型的对象,有一个有名的(is-a)规则,类似于我国古代的“白马非马”这个典故。它就是说,任何一个子类的对象都可以说成是其父类的一个对象,但是反之则不一定了,例如,我们可以说白马是马,但是不能说马是白马。这个规则的另外一个表示方法就是“替换”准则:凡是程序中需要用到父类对象的地方,我们都可以用其子类的对象来进行替换。
接下来,就产生了一个问题,我们调用test[0]的setName(Stringn)方法的时候,它调用的到底是PolymorphicTest类还是PolymorphicChild类的setName方法呢?这就涉及到动态绑定的问题了,对象如何自动的选择合适的方法来执行?
2. 动态绑定(DynamicBinding) 以上一节中的test[0].setName(Stringn)为例,我们现在有语句test[0].setName(“zhukai”),
那么它的执行过程是什么样的呢?
第一步:查看test[0]声明的类型,即PolymorphicTest类,然后获得方法名setName,接着把PolymorphicTest类中的所有名字为setName的方法以及其父类中所有名字为setName的public方法列出来。若没有名为setName的方法,则调用失败,否则转第二步。
第二步:根据所调用方法的参数类型来对上一步所列出来的所有方法进行匹配,直到找到一个匹配的转第三步,如果没有匹配则调用失败。
第三步:若test[0]所指向(referto)的对象的类型为其一个子类,则需查看子类有没有覆盖该方法,若有,则执行子类中的方法。
注1:如果这个方法是private或者static或者final类型的,就不用进行动态绑定了,因为编译器可以很准确的知道要调用哪个方法。
注2:查询匹配方法时,是按照继承树逐级向上查找,直到找到第一个匹配的。
以上就是动态绑定的过程。
以上面的程序为例,程序执行时,当执行test[0].setName(“zhukai”)时,将会输出“在父类中”,如果去掉PolymorphicChild中的注释,此时将会先输出“在父类中”,然后再输出“在子类中”。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号