码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA-初步认识-第四章-内存图解

时间:2017-09-27 11:42:38      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:存储   关键字   函数   图解   .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,就是由于上面的数组已经变为了垃圾。

技术分享

只要还有局部变量的指向,那么数组就不是垃圾。多个引用变量是可以同时指向一个实体的。

 

JAVA-初步认识-第四章-内存图解

标签:存储   关键字   函数   图解   .com   代码   ges   栈内存   src   

原文地址:http://www.cnblogs.com/wsw-bk/p/7600566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!