本文讨论点:
问题①:计算机内存中的数据是怎么存储的?
问题②:java的内存又是怎么分配的?
问题③:现实生活中,我们处理事情的两种方式是?直接或间接
1: 问题①:分配规则、读规则、写规则
①内存被按照一定的粒度(8位)分成一个个的小单元,并为所有的单元统一编号,例如从0000-9999;
②写数据时:每当写入数据到内存,就将对应的单元地址存放起来,以便访问(例如把地址放到a变量里面)
③读数据时: 每当要读对应的数据时,先通过a变量得到数据的地址,再通过地址就可以得到数据了
大概的示意图如下:
2、java的内存分配:分为堆和栈
java将其内存空间分为堆和栈,栈(stack)里面存放基本数据类型、引用(地址空间)、等等(属于直接存储的),而堆(heap)存放引用类型指向的的数据(对象字段);
基本类型变量存放的是对应值的地址,在访问变量时,直接就访问了值,中间的读取变量的地址的过程被底层跳过了;引用类型变量存放的也是地址,访问引用变量就直接访问了对象,而由于引用地址空间不规律,无法确定是访问哪一个字段(只有字段才存储数据),所以就形成了无法直接访问引用类型了。
3、来源于生活:java的内存分配来源于生活中的直接操作和间接操作。对于一些小问题,简单的问题,比如说老板要喝杯茶,你可以直接拿一杯茶他,这样就ok了,完成了。
当老板说句我要一辆法拉利,这个问题有点复杂了,法拉利太大太贵,我是无法一下子拿一辆法拉利到他面前,但是我可以告诉他销售法拉第的店铺地址xxxx,我说句
在xxx有一辆法拉利,你自己去取吧。前者相当于java里面的基本类型的访问,后者就是引用类型的访问模式了。想来想去,原来设计java的思路也不是凭空而来的,都是来源于生活中,现在写java代码还是要服务生活的。
其中给老板端茶,又可以分为2中方式:将老板的杯子拿出去直接在老板的茶杯里面泡茶和拿个茶壶来进来往老板的杯子里面加茶,相当于直接给变量赋值和将另外一个变量的值间接的赋给前面的一个变量。记得struts1中的FormBean用的是前者,而struts中的FormBean用的是后者,在struts1中,必须对bean的引用字段初始化分配空间,不然就出现nullPoint异常,相当于老板没有杯子,我必须给老板弄个杯子,不然茶往哪儿泡?
写着写着,思维变混乱了,待续了。。。