1. public static String str1 = "str1";
- 当这行代码执行时,字符串字面量
"str1"
会被放入常量池中。 str1
将会引用这个常量池中的对象。- 如果在程序中多次使用
"str1"
,Java会重用常量池中已存在的"str1"
字符串对象,而不会创建新的实例。
2. public static final String str2 = "str2";
- 与
str1
类似,这里的字符串字面量"str2"
也会被放入常量池中。 - 由于
str2
是static final
的,表示它是一个常量,因此可以在编译时进行优化。在大多数情况下,编译器会直接用"str2"
替换所有对str2
的引用。 - 这意味着只要有任何地方引用
str2
,编译器会用常量值替换,而不是通过变量访问。
3. public String str3 = "str3";
- 对于这行代码,字符串字面量
"str3"
同样会被放入常量池中。 - 但是,
str3
是一个实例变量(非static
),因此每个该类的实例都会有自己的str3
引用指向常量池中的"str3"
对象。 - 也就是说,尽管常量池中只有一个
"str3"
字符串对象,但每个对象都有自己独立的str3
引用。
总结
- 常量池中会分别添加
"str1"
、"str2"
和"str3"
三个字符串字面量。 str1
和str2
都是静态的,其中str2
是常量,可能在编译时进行优化。str3
是实例变量,每个实例都有自己的引用,但都指向同一个常量池中的字符串对象。