分享
 
 
 

深入理解Java延迟绑定

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

下面几个类用于确定今天晚餐要喝的酒以及酒的温度。

class Sommelier {

Wine recommend(String meal) { ... }

}

abstract class Wine {

// 推荐酒的温度

abstract float temperature();

}

class RedWine extends Wine {

// 红酒的温度通常略高于白酒

float temperature() { return 63; }

}

class WhiteWine extends Wine {

float temperature() { return 47; }

}

class Bordeaux extends RedWine {

float temperature() { return 64; }

}

class Riesling extends WhiteWine {

// 继承WhiteWine类的温度

}

下面的例子利用上面的类推荐一种酒:

void example1() {

Wine wine = sommelier.recommend("duck");

float temp = wine.temperature();

}

example1的第二个调用中,对于wine对象我们唯一可以肯定的是它是一个Wine,但可以是Bordeaux,也可以是Riesling或其他。另外,我们可以肯定wine对象不可能是Wine类本身的实例,因为Wine类是一个抽象类。编译源代码,源代码中的wine.temperature()调用将变成“invokevirtual Wine/temperature ()F”(class文件实际包含的是该文本表示形式的二进制代码,这种文本化的指令描述方法称为Oolong方法),它表示的是一个方法调用――一个普通的(虚拟)方法调用,而不是一个静态调用。它调用的方法是Wine对象的temperature,右边的“()F”参数称为签名(signature),“()F”这个签名中的空括号表示方法不需要输入参数,F表示返回值是一个浮点数。

JVM执行到该语句时,它调用的不一定是Wine定义的temperature方法。实际上,在本例中,JVM不可能调用Wine定义的temperature方法,因为该temperature方法是一个虚拟方法。JVM首先检查该对象所属的类,寻找一个符合invokevirtual语句指定的名称、签名特征的方法,如果找不到,则检查该类的超类,然后是超类的超类,直至找到一个合适的方法实现为止。

在本例中,如果实际创建的对象是一个Bordeaux,则JVM调用Bordeaux类定义的temperature()F,该temperature()F方法将返回64。如果对象是一个Riesling,JVM在Riesling类中找不到适当的方法,所以继续查找WhiteWine类,在WhiteWine类中找到了一个合适的temperature()F方法,该方法的返回值是47。

因此,查找可用方法的过程就是沿着类的继承树通过字符串匹配寻找合适方法的过程。了解这一原理有助于理解哪些修改不至于影响二进制兼容性。

首先,重新排列类里面的方法显然不会影响到二进制兼容性――这在C++程序中一般是不允许的,因为C++程序利用数值性偏移量而不是名称来确定要调用的方法。延迟绑定的关键优势正是在此,如果Java也使用方法在类里面的偏移量来确定要调用的方法,必然极大地限制二进制兼容机制的发挥,即使极小的改动也可能导致大量的代码需要重新编译。

?说明:也许有人会认为C++的处理方式要比Java的快,理由是根据数值性偏移量寻找方法肯定要比字符串匹配快。这种说法有一定道理,但只说明了类刚刚装入时的情况,此后Java的JIT编译器处理的也是数值性偏移量,而不再靠字符串匹配的办法寻找方法,因为类装入内存之后不可能再改变,所以这时的JIT编译器根本无须顾虑到二进制兼容问题。因此,至少在方法调用这一点上,Java没有理由一定比C++慢。

其次,还有很重要的一点是:不仅仅编译时需要检查类的继承关系,而且运行时JVM还要检查类的继承关系。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有