博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 方法调用绑定--《java编程思想》学习笔记
阅读量:5161 次
发布时间:2019-06-13

本文共 1967 字,大约阅读时间需要 6 分钟。

将一个方法调用同一个方法主体关联起来,就是绑定。 绑定分两种 :前期绑定 和 后期绑定 。

 绑定-------------

   | -----前期绑定-------编译期绑定 { static , final 方法 (private 方法属于final 方法);数据成员;

   |                                                    

   |------后期绑定-------运行时绑定 { 普通的成员方法 ;}

     总结:对于方法来说, 除了static 和final 方法外, 其他的方法都是后期绑定。

                编译时对引用只检查被声明的类型,而不看实际类型。

        将某个方法声明为 final 的作用-------

{  防止该方法被覆盖,即告诉编译器,对此方法不需要动态绑定;}

      多态产生的问题:

引用《java编程思想》(第四版)里的例子:

class Glyph{	void draw(){print("Glyph.draw();")}	Glyph(){		print("Glyph() before draw()");		draw();		print("Glyph() after draw()");	}}class RoundGlyph extends Glyph{	private int radius = 1;	RoundGlyph(int r){		radius = r;		print("RoundGlyph.RoundGlyph(), radius = " + radius);	}	void draw(){		print("RoundGlyph.draw(), radius =  "+ radius);	}}public class PolyConstructors{	public static void main(String[] args){		new RoundGlyph(5);	}}/*Output:Glyph() before draw()RoundGlyph.draw(), radius = 0Glyph() after draw()RoundGlyph.RoundGlyph(), radius = 5*/
new 一个RoundGlyph 对象时,构造器的执行顺序 是: 父类 ----->子类, 所以, 先执行Glyph 的构造器,

然后执行 RoundGlyph 的构造器,但是,Glyph 的构造器调用了 draw 成员函数,所以该执行 Glyph 的draw 成

员函数? No,因为多态,对于一般成员函数来说, 运行时才绑定, 因为new 的是 RoundGlyph 对象, 所以

绑定的是RoundGlyph 的draw 函数,与此同时,RoundGlyph 的 成员radius 还没初始化,所以出现了 0 。

接下来,就轮到 RoundGlyph 的构造函数了,因为在构造函数里 ,RoundGlyph 的成员 radius 先初始化了,

然后执行 RoundGlyph 的draw 函数,所以,radius = 5。

总结: 尽量避免在构造器中调用其他方法,防止因多态产生一些意想不到的问题。

现在,我们来看看C++ 中会不会出现这样的问题,把java 代码改成C++:

#include
using namespace std;class Glyph{public: Glyph(){ cout<<"Glyph() before draw() \n"; draw(); cout<<"Glyph() after draw() \n"; } void draw(){ cout<<"Glyph.draw(); \n";}};class RoundGlyph: public Glyph{public: RoundGlyph(int r){ radius = r; cout<<"RoundGlyph.RoundGlyph(), radius = "<< radius<<'\n'; } void draw(){ cout<<"RoundGlyph.draw(), radius = "<
<<'\n'; }private: int radius ; };int main(){ RoundGlyph * r = new RoundGlyph(5); return 0;}
运行结果为:

没有出现同样的问题,可以看出C++ 在多态的这个问题上表现得比较好。学 java 有一个作用,那就是让你

更好地理解 C++ 。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/Rex7/p/4752580.html

你可能感兴趣的文章
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
一周TDD小结
查看>>
sizeof与strlen的用法
查看>>
Linux 下常见目录及其功能
查看>>
开源框架中常用的php函数
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
(一一二)图文混排中特殊文字的点击与事件处理
查看>>
iPhone开发经典语录集锦 (转)
查看>>
SVM基础必备常识
查看>>
FPGA时序约束的几种方法 (转)
查看>>
cocos2dx 3.x tolua 分析
查看>>
oracle 外网访问
查看>>