首先得知道创建对象是不会在栈内存里操作的。如果是new出来的对象会在堆内存里开辟空间。
String s = "java";是在方法区的常量池里,创建以后把地址传给栈内存中的s,如果再想给s赋值
比如 s = "hello"; 现在的操作就是在常量池里操作的,要判断常量池里有没有"hello"这个常量,如果有,
就把“hello”的地址传给s,如果没有会分配一块空间给"hello",再把地址值传给s
而String s = new String("java");会在堆内存中给new出来的对象开辟一个空间,同时在常量池中也给字符串
“java”开辟了空间,相当于创建了两个对象,栈内存中s接收到的是堆内存中对象的地址值,常量池中的对象相当于是new出来对象的模版,从模版取值。栈内存s指向堆内存new出来的对象,对象指向常量池中的“java”。
这是我自己的一些理解,可能会有理解上从错误,毕竟我也是新手 |