首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
Java
J2SE / 基础类
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
技术帖,如果你想了解多态(关于多态性的动态绑定问题,对象调用方法的执行过程),那你不防来看看.虽有钻牛角尖的嫌疑,但你一定会发现
[已结贴,结贴人:qfs_v]
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-26 00:07:08
楼主
关于多态性的动态绑定问题。对象调用方法的执行过程!
虽有钻牛角尖的嫌疑,但你一定会发现值得你发现的东西!!
虚拟机预先为每个类创建一个表,列出所有的方法签名和实际调用的方法:
对象调用方法的执行过程
1.首先,编译器察看调用方法的对象的声明类型和方法名,如果声明类型为Private、statie、final 构造器,则静态绑定,找出并调用方法。
2.否则编译器列出所有方法和继承为public的方法。
3.如果重载的话,编译器察看调用方法时的方法参数类型,发生重载解析。最后将获得被调用方法的方法签名(方法名+方法参数列表)。
4.如果被调用方法没重写,就直接搜索定义该方法签名的类的方法表,调用该方法。
5.如果被重写意味着这个方法可能是超类的方法也可能是子类的方法。虚拟机会从子类到超类搜索定义该方法签名的类,调用与调用该方法的对象的实际类型相匹配的类的方法表,找出并调用方法。
6.如果是使用super将会只是编译器调用超类的方法,搜索超类的方法表,找出并调用。
有钻牛角尖的嫌疑。还是希望大家都来用力顶哈。。 小弟在此谢谢啦~~
在此我先谢谢 jingweixml()!
PS:因本人能力和表达能力有限,小错误嘛!总是有得,大家不要因为怕伤了我的自尊心而指出,为了本人前途大家尽力说出,本人会虚心接受的,并加强改进·
问题点数:
20
回复次数:
19
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-26 00:11:21
1
楼 得分:
0
PS:下面是jingweixml()兄弟以前对此发的意见。
jingweixml() ( ) 信誉:100 Blog 2007-3-24 9:11:57 得分: 0
编译和运行不管在哪种语言和哪类操作系统上都一样。问题的实质是:编译过程是编译器的事,与运行无关;而运行是操作系统的事,与编译无关。比如你问的“想知道编译器在进行对象调用方法的执行过程?”,这个问题本来就不对,编译器只是编译,调用是操作系统的事(对java是虚拟机的事),编译器编译时它顶多只关注下要静态绑定代码模块(函数或数据)还是动态绑定,静态绑定的意思是编译时它就把需要访问的变量和函数地址安排好了,当然开始是相对逻辑地址,待系统平台把程序代码搬到内存上运行时才把这些地址转换成实际的物理地址;而动态绑定就是编译时没有事先安排好要访问的变量或函数的实际地址位置,而是插入一些信息,这些信息一般是一些表,在程序运行时先调用这些表,再根据表里的指示信息去进一步调用相关对象(数据或函数),所谓面向对象的多态性或是所谓的虚函数实际就是这样解决的。
这里再想说下你提到的类的问题,类的定义实际只是语言层面的概念,即在语言环境里才有效,一旦编译成代码,类的定义就消失了,剩下的只是赤裸的变量和函数了,对于同一类里的变量和函数,编译时编译器就把它们做成相互调用的关系,比如某变量就变成了某函数的参数等,因此在源代码里我们常可写成直接去访问一个对象的变量,实际编译后就变成了调用这个变量的函数了,或者通过这个变量携带的一些信息表进一步指示去调用相关的函数,总之最后还是得通过调用函数才会起实际的作用。
最后你问的什么时候进行静态绑定,以上说很清楚了,就是在编译时就搞定。什么时候发生重载解析?那一定是运行的时候了。我想大致就这么回事吧,这也是本人的小见,请高手进一步指正。
另外以上说的编译和运行无关只是相对而言,实际编译软件的开发肯定是要根据其所基于的操作系统来开发的,实际是肯定要根据操作系统所能提供的API功能来做,而不可能超越它;如果操作系统是基于组件的模型的(如Windows的com及java系统的组件体系等),那你要想基于其上运行,开发语言就得依照它的组件规则来开发。另外需要说明的是,如果系统平台天生具备面向对象特性的,那我们进行语言编译器开发时就可直接利用它的特性,编译器需要包含的功能就少些,否则编译器就相对复杂,因为这意味着要在开发层面上添加许多支持面向对象的特性,这是没办法的事,因为操作系统不支持啊。
另外想说下关于有提到的构造函数问题。类也是数据类型,本质上声明一个类跟声明一个基本数据类型是一样的,如 "class 类名 "与 "int 变量名 "是一样的,都是为变量申请空间或是赋值,但类型发展到类时我们就喜欢在类里放入一些构造和析构函数,这就不得不涉及动态和静态创建(实际是申请)对象(实际是内存空间)问题,为什么要动态和静态的问题,这都是出于节省内存空间,也许 "int a "需要内存空间小,所以很少人去想怎么动态创建和销毁它的问题,但类的体积可大可小,大的可以很大,如果不考虑动态创建和销毁问题,一个程序运行下来可能占用的内存空间就很大,所以在后来的编译器上就加入了动态创建和销毁对象的机制,这一机制就是“构造/析构函数”机制。实际上如果你不想用这些机制也行,那你就给类做静态连编吧,这样在编译时就直接创建对象空间插入二进制代码中,作为程序不可分离的一部分,如此而已。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
For_suzhen
不懂装懂
等级:
发表于:
2007-03-26 08:02:00
2
楼 得分:
2
UP
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-26 15:46:14
3
楼 得分:
0
0
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
healer_kx
甘草
等级:
发表于:
2007-03-26 15:51:46
4
楼 得分:
2
这个问题对于一个Cpper都是很简单的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
frilly
秋◆水
等级:
发表于:
2007-03-26 16:10:29
5
楼 得分:
2
xuexi
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-26 17:28:14
6
楼 得分:
0
healer_kx(甘草 我在等你出现,体验爱恨缠绵)
可以说清楚些吗?? 谢了!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-26 19:14:41
7
楼 得分:
0
怎么没有人来啊......
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-26 19:16:11
8
楼 得分:
0
自己顶起!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hc9527
等级:
发表于:
2007-03-26 19:41:56
9
楼 得分:
0
上海交大JAVA (最新版)2CD 30元
上海交大JAVA (李柏岩)2CD 20元
天峰培训 J2SE+JSP 3CD 35元
上海劳动局JAVA培训 3CD 35元
北京尚学堂JESE+BBS/聊天室/坦克大战项目开发 视频教程 6CD 60元
JAVA-WEB 视频教程 (2007最新版)内有项目开发教程 3CD 40元
中国IT实验室 刘晓涛 J2SE+J2EE 视频教程 12CD 120元
赛迪网 J2EE 培训 8CD 80元
软件设计师培训 2CD 80元
张孝祥JAVA培训 13.5G 100元
----------------------------------------------------------------
上海交大计算机网络 (51讲)3CD 40元
东南大学C++ (80讲CSF格式)3CD 35元
东南大学数据库概论 (42讲) 2CD 20元
数据结构 C语言版(严蔚敏主讲)8CD 100元
----------------------------------------------------------------
有诚意者请加 QQ:631728670 洽谈!无意者拒绝骚扰
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
kkiieerr007
等级:
发表于:
2007-03-26 22:20:31
10
楼 得分:
5
不错,听君一席话又钩起偶对操作系统的回忆,这样联系起来感觉颇深
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-27 16:01:28
11
楼 得分:
0
.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-29 17:53:52
12
楼 得分:
0
没有人来哦哦。。。为什么啊?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
gyryqtfy
Zealot
等级:
发表于:
2007-03-29 19:58:02
13
楼 得分:
2
帮顶而已
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-30 16:13:01
14
楼 得分:
0
up
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
unrealgf
等级:
发表于:
2007-03-30 18:00:55
15
楼 得分:
2
学了JAVA1年 还是不怎么看得不懂2楼的话 ,管他是什么原理,能用就行
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qfs_v
效 率
等级:
发表于:
2007-03-31 18:30:21
16
楼 得分:
0
这...
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ohuan
党员不发威,还当我是团员!
等级:
发表于:
2008-02-25 17:01:57
17
楼 得分:
2
学习,帮顶~~~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
healer_kx
甘草
等级:
发表于:
2008-02-25 17:03:24
18
楼 得分:
2
太简单了。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
bao110908
火龙果@宝家族
等级:
发表于:
2008-02-25 17:28:31
19
楼 得分:
1
这谁也太会翻了吧,一年前的帖子。。。。。。
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友