Java中的字符串初始化

Gab*_*是好人 8 java string

  1. String str1;
  2. String str2 = null;
  3. String str3 = "";
  4. String str4 = new String();
  5. String str5 = new String("");

我知道对于上面的第三次初始化,字符串对象在字符串池中初始化,第四次与字符串池无关.

1.和2.有什么区别?如果我将其str1视为指针变量,它存储的是一个从未被JVM或OS使用的特定内存地址?

4和5之间有区别吗?

当我打印str1str2直接通过System.out.println(str1)System.out.println(str2),因为str1,我甚至无法传递编译.因为str2,编译是正常的,我得到"null"和控制台窗口中的输出.为什么?

在@aioobe回答之后编辑:更多问题:

我想更多地了解"null".因为str2(引用变量)就像一个指针变量,所以它应该有一些东西(0/1位)(在这个指针变量占用的内存中).当它被初始化为null时,它是全0位还是null的字节码全为零?另一个问题是,如果我调用toString()方法上str2str2.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()str2str2.toString(),我得到了在运行时一个空指针错误.那么JVM是否检查引用变量是null什么?

是.

JVM怎么知道它是null?JVM检查位str2

是.