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