String str = new String("abc");
首先将这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给 它,显然也没有创建对象;现在只剩下new String(“abc”)了。先看一下new String()构造函数:
public String(String original) {
// other code
}
我们是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。但是发现该构造函数的参数是一个String类型的,我们要知道String本身就是一个对象。而该对象正是“abc”。
所以得出结论,这行代码一共创建了两个对象,一个是str引用所指向在堆内存中的对象,一个是“abc”;
该行代码内存分配问题,可以参考这篇文章:https://blog.csdn.net/qq_28082757/article/details/89886132
str 是创建了一个引用,它是存放在栈内存中的。
abc 这个其实应该是在常量池中的。
技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。