黑马程序员技术交流社区

标题: Java堆内存和栈内存的区别,留给新人们,绝对有帮助 [打印本页]

作者: killuakillua898    时间: 2013-10-8 16:41
标题: Java堆内存和栈内存的区别,留给新人们,绝对有帮助

之前看了毕老师的视频,对于栈和堆一直搞不清楚,最近在黑马论坛上又发了几个帖子询问,自己又重新复习了一遍,并且看了一些大神们的技术博客,觉得有一些收获,就分享记录下来。


1.    堆内存和栈内存的区别

栈内存,方法中和局部代码块中局部变量,没有默认初始化值

而堆内存则是new建立的实体,有默认初始化值


2). 举例分析1

举例如下:


line 1中,虽然对x没有进行初始化,但是在对x=0;赋值的过程中,没有对x的内容进行读取,所以不会报错。

line 2中,虽然也是这种开始没有对y进行初始化,之后,又对y进行赋值。但是 赋值的过程中,使用了 +=运算符,解析开:y =y+ 5;  计算右边的时候,y是栈内存变量,没有初始化,就没有值,所以这一步读取y是没有意义的,所以编译会报错!!!

line 3中,想法一样,把++还原成基本的单独赋值语句:z= z+1; 右边运算的时候,读取z的值,由于最开始没有初始化,不知道值是多少,所以编译出错。

line 4中,由于str引用变量开始没有被初始化,所以(读取) 访问其内部成员是没有意义的。所以编译报错!!!

结论:只要涉及到栈内存中局部变量读取的情况,只要是这个栈内存变量没有被初始化,但是对其进行读取了,就会发生编译错误!!!无论是基本数据类型的变量还是引用数据类型的变量

3). 举例分析2

如果引用类型的变量有初始化值为null,或者运算过程中接收到某个方法的返回值,但是这个返回值也为null,如果在这后面进行了对这个值为null的引用类型的变量进行读取操作,编译通过,但是运行时会抛出java.lang.NullPointerException





作者: 乔兵    时间: 2013-10-8 16:49
感谢分享
作者: To    时间: 2013-10-8 16:57
楼上正解。楼主保持分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2