标签:存储 关键字 函数 图解 .com 代码 ges 栈内存 src
栈内存和堆内存是内存划分中,始终存在的。两者相互配合使用。
数据类型的划分中,将数组分为引用数据类型,就在于局部变量从数组实体中获取数据的方式得来的。数据类型分为,基本数据类型和引用数据类型。引用数据类型重点在于“引用”,“基本”和“引用”的不同就在于机制的不同。类和函数也被称作引用数据类型,说明它们也是独立存在,可以被调用的,具体可见前面的功能化函数调用。
上图中的代码不一定放在主函数里,但是变量一定有自己的所属函数。
我们来分析一下流程:cpu划分的五部分内存是一直存在的,首先在栈内存中,加载进去函数和属于函数的局部变量。为了明确基本数据赋值和引用数据赋值的不一样,我们在定义局部变量时,将二者区分开来,一个是int x,另一个是int[] x。一个是int类型,另一个是[]数据类型,但是为了表示出数组实体中存放的是什么类型的数据,在[]数组类型的前面加上所存储数据的类型int。同时,堆内存中也要准备好对应的数据,先是根据关键字new,在堆内存中开辟出一个数组类型的空间,空间的大小为3,同时给3个小空间给定空间地址(先给定地址,后给定数值)和默认赋值,最后将对应空间地址传送给局部变量,由局部变量自己来数组中搜寻数据。这一过程,可以理解为局部变量的数据本身是没有的,引用的都是来自数组的数据。
对于第二个语句int[] y=new int[3]而言,y和x引用的绝不是同一个数组,是重新定义的另一个数据。
接着的x[]=9, y[]=34, 都是对数组中的元素进行赋值和栈中的局部变量没有任何关系。
最后,书写了x=y的语句,x和y都是局部变量,它们之间赋值操作是在栈内存中操作的,将y的内存的空间地址给x,然后x去下面的数组来搜寻对应的位置的数据,上面的数据就变成了垃圾。接着System.out.println(x[0]),输出的是34,就是由于上面的数组已经变为了垃圾。
只要还有局部变量的指向,那么数组就不是垃圾。多个引用变量是可以同时指向一个实体的。
标签:存储 关键字 函数 图解 .com 代码 ges 栈内存 src
原文地址:http://www.cnblogs.com/wsw-bk/p/7600566.html