Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1348074
  • 博文数量: 277
  • 博客积分: 2551
  • 博客等级: 少校
  • 技术积分: 3918
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 22:46
文章分类

全部博文(277)

文章存档

2017年(3)

2016年(9)

2015年(65)

2014年(27)

2013年(85)

2012年(61)

2011年(27)

分类: Java

2013-04-11 21:37:22

   java程序编译后,链接的动作是在运行时进行的,c/c++类的程序的链接是在编译时做的。
   如果说程序的链接有多重含义,链接可以说是符号的连接,链接可以是数据加载到内存后的地址的确定化。
   class文件之间虽然是独立的,但class文件在加载到内存后,它们之间通过符号引用相连。
   class文件加载后,就会形成一个运行时的常量池,而它们构成了类和接口的网络,实际上这个常量池就是类似于C/C++中的符号表。
   有文件的常量池的,也有内存中的常量池,也叫运行时的常量池,所以文件常量池的解析实际上就是符号引用的定位过程,也就是符号连接替换成直接连接的链接过程。在class文件加载中,会在堆区创建Class对象以及永久区创建类型信息结构,并建立关联。
   java源文件中的成员方法编译成字节码后就构成了class文件中的代码区,当然字节码中的一些方法或字段的引用还是要参考class文件中常量池。
   在java程序运行时,也会在堆区创建实例对象,实例对象也会与永久区的类型信息结构,Class对象建立关联。
   在堆区创建实例对象,它的结构与C++中的对象类似,也有方法表,但是方法表中保存的应该是运行时加载到内存的代码区的引用。目前还不清楚这个代码区的加载是如何的,是每个方法都占用一个item,还是一个class的方法区是整体的,连续的。不过,在实例对象的方法表中填充的是当前的方法在代码区的偏移量。
   不论是C++还是Java,实例对象都是表示要处理的数据的承载体,运算相关的都是方法体部分,也就是说数据与计算是分离的。
    计算的输入都是数据,也就是实例对象,计算的过程都是方法,所有的实例对象共享了方法区。
    java程序中也有类似命名空间的概念,类似C++中命名空间,但是java的命名空间是基于类加载器的,java命名空间也类似包的概念。
  
阅读(1360) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~