《Thinking in Java》 学习笔记---多态?晚绑定。

在面向对象的思想中,可以把子类实例看作他的父类来进行方法调用。

例如,”形状”类具有绘画方法, “圆形”,”矩形”都属于形状的子类,他们都拥有绘画这一方法,但却又不同实现。  

在实例化的时候我们可以这样写:

Shap s = new Circle();

或者

Shap s1 = new Cube();

,然后再调用他的绘画方法

s.showMe();

s1.showMe();

 

这样一来,Java无法在编译时就知道将要被调用的方法,而会在运行时进行调用方法的判断。

在其他非面向对象的语言中,方法的调用是通过“前期绑定”实现的。也就是说编译器将会产生一个具体的函数名字的调用,而链接器将这个调用解析到将要被执行的代码的绝对地址。

s.showMe();----->指向绝对地址

s1.showMe();----->指向绝对地址

然而在Java中。程序直到在执行的时候在能够知道确切的被调用的代码。所以这里采用了被称为”晚绑定”的机制:

当你调用方法的时候,被调用的代码直到运行时刻才能被确定。编译器确定被调用函数的存在,并对参数和返回值进行类型检查,但并不知道被执行的确切代码。

为了执行后期绑定,Java使用一小段代码来代替绝对地址调用。这段代码使用在对象中存储的信息来计算被调用的方法体的实际地址(详见第七章)。

showMe();----->指向一小段代码

这样,通过这一小段代码的内容,每一个对象都可以有不同的行为表现。当你调用一个对象的方法的时候,该对象通过以上机制就能够知道实际被调用的代码是什么。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值