栈内存和堆内存是内存划分中,始终存在的,两者相互配合使用。即使没有定义数组,内存中也会划定一个专门的空间给数组么?
上图在操作到输出语句sop(arr[0])时,栈内存就开始和堆内存构建联系,因为栈内存中的局部变量要用到堆内存数组中的数据。(这里说的不对,在第一句中变量array就已经和数组实体构建了关系,将数组地址给了变量。)
数据类型的划分中,将数组归为引用数据类型,就在于局部变量从数组实体中获取数据的方式来分类的。数据类型分为,基本数据类型和引用数据类型。引用数据类型重点在于“引用”,“基本”和“引用”的不同就在于机制的不同。类和函数也被称作引用数据类型,说明它们也是独立存在,可以被调用的,具体可见前面的功能化函数调用。
上图中的代码不一定放在主函数里,但是变量一定有自己的所属函数。变量一定要有函数么?貌似是不一定的。
我们来分析一下流程: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,就是由于上面的数组已经变为了垃圾。
只要还有局部变量的指向,那么数组就不是垃圾。多个引用变量是可以同时指向一个实体的。
总结:这里是将栈内存中的局部变量和堆内存中的数据之间的联系,用图例表现出来。我觉着刚开始在栈中创建数组名和堆中创建数组时,局部变量(数组名)并没有和数组中的任意一个数据挂上构,一旦arr[]的[]中写上索引,那么局部变量就开始和数组挂钩了。
还没有评论,来说两句吧...