String str1;String str2 = null;String str3 = "";String str4 = new String();String str5 = new String("");我知道对于上面的第三次初始化,字符串对象在字符串池中初始化,第四次与字符串池无关.
1.和2.有什么区别?如果我将其str1视为指针变量,它存储的是一个从未被JVM或OS使用的特定内存地址?
4和5之间有区别吗?
当我打印str1并str2直接通过System.out.println(str1)和System.out.println(str2),因为str1,我甚至无法传递编译.因为str2,编译是正常的,我得到"null"和控制台窗口中的输出.为什么?
在@aioobe回答之后编辑:更多问题:
我想更多地了解"null".因为str2(引用变量)就像一个指针变量,所以它应该有一些东西(0/1位)(在这个指针变量占用的内存中).当它被初始化为null时,它是全0位还是null的字节码全为零?另一个问题是,如果我调用toString()方法上str2的str2.toString(),我得到了在运行时一个空指针错误.那么JVM是否检查引用变量是否为空?JVM如何知道它是null?JVM检查位str2?
大约一个问题空在Java中: 空的级联和字符串文字
aio*_*obe 16
1.和2.有什么区别?如果我将其
str1视为指针变量,它存储的是一个从未被JVM或OS使用的特定内存地址?
如果这些是类中的字段,则没有区别,因为引用类型(例如String)的字段的默认值已经存在null.
如果这些是局部变量(即在方法中声明的变量)str1将不会被初始化为任何东西,而str2将被初始化为null.这里的区别是局部变量在初始化之前不能使用,所以(你似乎已经发现)你无法打印str1,但你可以打印str2.
4和5之间有区别吗?
不,不是语义上的.你会得到略有不同的字节码.
当我直接通过System.out.println(str1)和System.out.println(str2)打印str1和str2时,对于str1,我甚至无法传递编译.对于str2,编译是正常的,我在控制台窗口中得到"null"和输出.为什么?
这似乎表明这些是局部变量.局部变量在使用之前需要初始化.
我想更多地了解"null".因为
str2(引用变量)就像一个指针变量,所以它应该有一些东西(0/1位)(在这个指针变量占用的内存中).当它被初始化为null,是全0位还是字节码null全为零?
这已被问及(并已回答):
另一个问题是,如果我调用该方法
toString()上str2的str2.toString(),我得到了在运行时一个空指针错误.那么JVM是否检查引用变量是null什么?
是.
JVM怎么知道它是
null?JVM检查位str2?
是.