String s = new String("1");
常量池对象:中会查看是否有已经是 "1" 的字符串常量,如果没有,那么会在常量池中创建它。这个 "1" 就是在方法区的字符串常量池中创建的一个对象。存放于方法区
堆上对象: 即
new String("1")
。这是一个新创建的String
对象,存放在堆空间上。这个新对象内部有一个变量指向了在字符串常量池中的 "1"。存放于堆引用变量:即
String s
。这是在栈上创建的一个引用变量,它存储的是new String("1")
这个 String 对象在堆上的地址。存放于栈
所以这条语句,会创建1-2个对象,和一个引用;
new String("1")
创建了一个新的String
对象在堆内存中,这个对象内部有一个指针指向字符串常量池中的 "1"。String s
创建了一个引用变量s
在栈内存中,这个引用变量指向在堆上新创建的String
对象。
所以,实际上有两个指向操作:
String
对象指向它的值,即字符串常量池中的 "1"。引用变量
s
指向这个String
对象。