java知识点3(null)

Posted 曼陀罗1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的垃圾回收机制回收。


博客:https://blog.csdn.net/sunkun2013/article/details/11821713

    Vehicle veh1;

    veh1 = new Vehicle();

第一句:在栈中创建了veh1的引用。

第二句:在堆中创建了veh1的未被初始化的实例对象






以上是关于java知识点3(null)的主要内容,如果未能解决你的问题,请参考以下文章

java知识点3(null)

java知识点3(null引用相关知识(自己理解))

EasyClick 运行代码片段出Null

EasyClick 运行代码片段出Null

从JVM的角度看JAVA代码--代码优化

getActivity() 在片段上返回 null?