额,前辈。我是这么认为的
我们在使用String s=new String();创建一个字符串对象,首先它在栈内存中就有了一个字符串类型的引用s,并且我们假设它在堆内存中分配的地址是12345;"abc"本身就是一个对象了,当我们传入了一个字符串"abc"作为参数传给了对象s,
那么s就会先在内存中常量池,字符串常量池去找这个abc对象。abc在常量池中是有地址的,比如说是12344,(本来直接可以用s指向常量池中abc的,但是我们new了一下他就有了新的地址12345,也就是我们创建了一个新的对象)
当它作为了参数传给了一个新的字符串对象s,那么s就拿着12344这个地址找到了了abc对象,然后jvm就照着abc的摸样又造了一个abc给了s。我通过这12344和12345这两个地址都可以找到abc这个对象,但却不是一个对象了。
(注意,这里并没有把abc以前的地址值给覆盖掉,)
举个实际中的例子吧:比如说一个富翁,他有一套别墅叫白宫,在xxx区。然后他就又想在yyy区建造一个一模一样的别墅也叫白宫。也就是说这个富翁就是你,你本来在常量池中有了一个别墅,后来又在新的地址上建造了一个一模一样的别墅。你通过xxx可以找到白宫,你通过yyy也可以找到白宫!
{:soso_e128:}请笑纳呀! |