之前看了毕老师的视频,对于栈和堆一直搞不清楚,最近在黑马论坛上又发了几个帖子询问,自己又重新复习了一遍,并且看了一些大神们的技术博客,觉得有一些收获,就分享记录下来。
栈内存,方法中和局部代码块中局部变量,没有默认初始化值
而堆内存则是new建立的实体,有默认初始化值
举例如下:
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
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |