java知识点3(null)

优秀博文地址:http://www.cnblogs.com/znsongshu/p/6282672.html
另一个帖子:https://bbs.csdn.net/topics/380085577?list=lz
其中的总结部分:
多谢各位的热心分享,试着总结:

1) String str;
栈内存开辟一块空间,存储str引用

2) String str = null;
栈内存开辟一块空间,储存str引用,
栈内存中(或者堆内存中?)开辟一块空间,
str指向那块空的内存的地址

3)String str = new String("String");
栈内存开辟一块空间,储存str引用,
堆内存中开辟一块空间,储存新建的String对象“String”,
str指向堆内存中新String对象的地址


来个总结吧:

int test(){
String str = null;
str = "String";
}
像这种String str = xxx;
不管xxx是null还是其他字符串,str这个东西都是在栈里有块空间,可以理解为c的指针,=null的时候,里面存的是0(这块不知道对不对),非null的时候存的是实际字符串的地址(堆中或者常量池中)。

而String str;
这种情况,jvm同样也为其分配了一块空间,但是不知道值是多少
java语法要求引用之前必须初始化,所以你直接这么写,str根本不能引用,所以无所谓。
其实jvm也完全可以不为它分配空间。

这个问题,说到底,其实就是java的语法要求,必须初始化的问题。

如果有C语言经验的话,可能有这样的问题,
int i;
int j = i; //使用了未初始化的i
因为i没有初始化,所以i是个“随机的值”,比如i可能是5,可能是8,可能是……
java为了避免这种问题,语法上规定,局部变量在使用之前,必须初始化!如果不初始化就报错。

令一篇博客里说:
java中对象引用放在栈中,对象的实例放于堆中,一个对象要是只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。 
而null对象在堆中会被java的垃圾回收机制回收。


猜你喜欢

转载自www.cnblogs.com/shanchuang-119/p/10253870.html