第十章 类、对象与实现(二)

2015-01-27 06:28:22 · 作者: · 浏览: 119
。动态变量在符号表中的1W数据,高16位依然是动态变量的行数大小;但低16位不再是相对地址,而是唯一指示动态变量的动态对象号。这一字数据会传入CPU的寄存器A;很简单,编译器只是多汇编出一条到A寄存器的立即数传送指令吧。对于数组动态变量,还需另外传送数组的16位宽度的成员项数和成员位宽度到CPU的寄存器B。B和A(行数)都放在动态对象头,而A的动态对象号却形成间接引用指针放在对象引用变量中。接着,用户需以寄存器A的参数调用内存管理员中的方法获得内存地址等数据并保存,之后是初始化方法,否则系统默认初始化为0。我真不明白JAVA为何要在栈建动态变量符号表?不多余?

在堆中产生了一个动态数组或动态对象后,还可以在相应对象属性表中定义一个特殊的变量,让对象属性表中这个变量的取值最终找到数组或对象在堆内存中的首地址,对象属性表中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用对象属性中的引用变量来访问堆中的数组或对象。引用变量是普通的变量,定义时在对象属性表中分配,引用变量在程序运行到其作用域之外后被释放(还在的,但如果释放内存,会变为空指针);而动态数组和动态对象本身在堆中分配。动态数组和动态对象在没有引用变量指向它的时候变为垃圾;不能再被使用,但仍然占据内存空间不放;在随后的一个不确定的时间被垃圾回收器收走(释放掉)。所以,用户对象退出时调用析构方法;而析构方法要包含释放对象内存代码。

  ◆常量池:存放常量(一般放在方法表区)

 

3、表

表的定义:BUxH 表名字{ n个元素… },表中的每行一个元素的声明以;结束。BUxH意思是表占有x行(16字/行)的存储空间;不写也行,由编译器据元素占用情况定。类的定义:class 类名字{ 类属性表{},类方法表{}}。程序的所有具体类,编译器都实例化一个与类同名的对象出来;并为它们分配好逻辑地址空间,分配对象号,建立对象头列表。具体类对象属性表也可以一开始就初始化(在类文件中设置),或由系统默认清0,或另外写一个初始化(构造)方法。全局表或全局变量或静态变量(包括一些复杂类型的常量)和对象头表、类表及一些公共方法,建立一个程序根类来实现。在编译器符号表中,对象名对应的地址值:高16位是所属的类号;低16位为对象号。在堆中分配的动态变量(包括对象、向量、大数组等)全部视为动态对象,编译器对于代码块中的对象、动态变量(用DYV声明)都分配动态对象号;可由对象序号构成对象头表。抽象类(包括接口),虽然没有实例化的对象,但有类关系(描述继承关系)、抽象属性,还有抽象方法。抽象类(包括接口)和具体类构成树结构;所有的类名、类关系、抽象属性名字,还有抽象方法名字等等最终组成类表。类表、对象头表、对象属性表、具体类方法表为四大要素表。

1)、类表

金字塔形的树状类表,有三个层次:

1))、纯抽象类:只有抽象属性和抽象方法;接口是只有抽象方法的纯抽象类。只有抽象属性的类为概念类。

2))、普通抽象类:可有抽象属性和普通属性,可有抽象方法和普通方法。

3))、具体类:只有普通属性和普通方法。

类描述的是该类成员(成员也可能是类)的特征,与类的所属关系;还有行为或说成员所具有的能力。伟大的、光荣的、无产阶级革命家雷锋同志。电脑如何理解呢?伟大、光荣是2个概念类;无产阶级革命家、同志是有抽象属性和抽象方法的纯抽象类;有一个多继承于它们的隐藏具体类;雷锋是具体类中的一员;毛泽东、周恩来等也是其中一员。大海中的海生动物类中的龟类中的小龟类中的mm小龟正在 游玩。这是金字塔中,从上往下的类描述,我们的语言通常是隐藏了中间的抽象类层次;只是说明路径的2端。如大海中的mm小龟 正在游玩。大海是根类;小龟是具体类,mm是具体类中的一员;游玩是小龟类的能力或其具有的抽象方法,而“正在”是“游玩”方法的时间描述,也就是方法的属性或说是变量。“游玩”是一个抽象方法,也可以搞成一个接口。不止是小龟的“游玩”,狗、猪、牛也可以继承这个接口。不知道大家晕了没有?我是差不多要晕倒了。

金字塔的顶端之后是什么?如“物类”,物之顶是“虚无”吗?我不知道!但一些根类的之后,我大约了解一些。比如“水果”这抽象类,并不能说它是继承于果树类;只是果树类中;花、果、等等抽象属性中的一种。果树类继承植物类,植物类继承生物类,生物类继承于物类。“水”之后是什么?是分子式类中的H2O属性吗?显然,抽象类的属性可以是类;这不是继承方式,是另外一种包含方式,称为包含类。具体类的属性可以是另一个对象的引用,但不能是类。

每一个类都有与类名字对应的类名序号。一个类有派生类和包含类,它们的类名序号构成字数组。这是类的子类描述变量,子类数量可以是变动的,我们应该视电脑为另一种智能生命;而不是死物。随着电脑的不断学习、不断进步;子类数量就可能增加。


每一个类都可能继承多个父类,我们把继承的父类序号,包括到根路径上的继承链上的所有父类序号一起构成类继承关系字数组变量;数组里的所有父类序号是唯一的、一个序号只能出现一个。一个对象的初始化方法或析构方法,必须按照对象所属类的继承关系数组中的具体类来进行。子类变量和类继承关系变量是每个类必有的属性;要记住 继承就意味着全盘接收父类的方法和属性。对于行为来说是使用抽象类还是接口,就要看实际情形了。子类变量提供了一条由上到下的路径,这会破坏对象的封装性;所以,接口和抽象类要慎重设计。类关系数据库文件是人类知识库中的一个文件,类名序号需要用32位来表达数十亿的公共类。一个程序里的类应该不多,默认最大是256个;用户最多可设置到2K个。类都可以实例化,只不过是具体类实例化成对象吧。接口也是一种抽象类,理论上,其实例化是子类变量和类继承关系变量;
接口调用是:对象名.接口方法名字();

但编译器如发现该对象所属的类有相同的方法名,就直接编译成直接调用对象所属类的方法了。所以,接口实例化的好处只是知道接口之间,类与接口之间的继承关系吧。

类表:以类号顺序排列的类项构成的表;每类项占4行存储空间;最多8KH。

类项:前2行为类继承关系字数组,可标识32个父类以上的类号。第3行是子类变量,可标识16个下级子类号。对于类继承关系变量或子类变量;如果第一个字符是0xA5A5,表示多于32个继承关系或16个子类,需要动态变量来扩充;随后的3个字符是动态变量指针(所占行数、块号、行开始地址)。对于抽象类,第4行也属子类变量。对于具体类,第四行:16位一个参数,方法表指针(方法表所在的块号、方法表的行开始地址),方法数,方法表所占的行数;本类的对象数,属性表的属性项数,属性表所占的行数。

16位的类号:高3位为类的类型,从111到000依次是:根类、纯抽象类、概念类、接口、普通抽象类、包含类(也是小根类)、具体类、类库(只有方法的具体类)。最低2位为00;指向该类项的第0行地址。中间十一位是类的序号,最多标识到2K个类。

对象头表:以16位对象号顺序排列的1W对象属性表入口指针(块号,行开始地址)构成的表;最多64K个对象占用8KH。


在自然界中,存在就是合理;我们不应改变自然规则,使自己处于狭窄的时空。

2)、编译器符号表简单介绍

表变量BBL对应的