分享
 
 
 

多态与动态绑定

王朝other·作者佚名  2007-05-24
窄屏简体版  字體: |||超大  

该文内容为本人学习Java核心编程第七版时做的学习总结以及一些理解,部分内容为翻译过来的。

1. 多态(polymorphism)

在面向对象的编程里面,多态是一个出现频率比较高的术语,那么多态到底是指什么

呢?一个对象变量(object variable,与基本数据类型的变量相对应)可以指向(refer to)多个类型的对象,这就是多态。以下面的代码为例:

public class PolymorphicTest {

public PolymorphicTest() {

}

public void setName(String n){

this.name=n;

System.out.println(“在父类中”);

}

public String getName(){

return this.name;

}

private String name;

}

public class PolymorphicChild extends PolymorphicTest {

public void setArea(String a){

this.area=a;

}

public String getArea(){

return this.area;

}

//public void setName(String n){

// super(“n”);

// System.out.pirngln(“在子类中”);

// }

public static void main(String[] args) {

PolymorphicChild child=new PolymorphicChild();

PolymorphicTest test[]=new PolymorphicTest[2];

test[0]=child;

test[0].setName(“zhukai”);

test[1]=new PolymorphicTest();

}

private String area;

}

test[0]声明为一个PolymorphicTest的变量,但是它可以refer to一个PolymorphicChild类型的对象(如child),当然它也肯定可以refer to一个PolymorphicTest类型的对象,因为它本身就是这个类型的,例如test[1]。为什么会这样呢?一般来说,一个对象变量可以指向(refer to)任意一个它自己所属类型及其子类型的对象,有一个有名的(is-a)规则,类似于我国古代的“白马非马”这个典故。它就是说,任何一个子类的对象都可以说成是其父类的一个对象,但是反之则不一定了,例如,我们可以说白马是马,但是不能说马是白马。这个规则的另外一个表示方法就是“替换”准则:凡是程序中需要用到父类对象的地方,我们都可以用其子类的对象来进行替换。

接下来,就产生了一个问题,我们调用test[0]的setName(String n)方法的时候,它调用的到底是PolymorphicTest类还是PolymorphicChild类的setName方法呢?这就涉及到动态绑定的问题了,对象如何自动的选择合适的方法来执行?

2. 动态绑定(Dynamic Binding)

以上一节中的test[0].setName(String n)为例,我们现在有语句test[0].setName(“zhukai”),

那么它的执行过程是什么样的呢?

第一步:查看test[0]声明的类型,即PolymorphicTest类,然后获得方法名setName,接着把PolymorphicTest类中的所有名字为setName的方法以及其父类中所有名字为setName的public方法列出来。若没有名为setName的方法,则调用失败,否则转第二步。

第二步:根据所调用方法的参数类型来对上一步所列出来的所有方法进行匹配,直到找到一个匹配的转第三步,如果没有匹配则调用失败。

第三步:若test[0]所指向(refer to)的对象的类型为其一个子类,则需查看子类有没有覆盖该方法,若有,则执行子类中的方法。

注1:如果这个方法是private或者static或者final类型的,就不用进行动态绑定了,因为编译器可以很准确的知道要调用哪个方法。

注2:查询匹配方法时,是按照继承树逐级向上查找,直到找到第一个匹配的。

以上就是动态绑定的过程。

以上面的程序为例,程序执行时,当执行test[0].setName(“zhukai”)时,将会输出“在父类中”,如果去掉PolymorphicChild中的注释,此时将会先输出“在父类中”,然后再输出“在子类中”。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有