A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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


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




点评

保持分享  发表于 2014-8-10 00:30

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
感谢分享

点评

支持  发表于 2014-8-10 00:29
回复 使用道具 举报
To 金牌黑马 2013-10-8 16:57:46
藤椅
楼上正解。楼主保持分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马