关于#java#的问题,如何解决?

廖雪峰的 java 引用类型参数绑定
public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        String[] fullname = new String[] { "Homer", "Simpson" };
        p.setName(fullname); // 传入fullname数组
        System.out.println(p.getName()); // "Homer Simpson"
        fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
        System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"?
    }
}

class Person {
    private String[] name;

    public String getName() {
        return this.name[0] + " " + this.name[1];
    }

    public void setName(String[] name) {
        this.name = name;
    }
}

输出: Bart Simpson

img


执行fullname[0] = "Bart";后,fullname[0]的地址变了吗?p.name的地址呢?

val a = "t"
System.out.println(System.identityHashCode(a))
自己打印看一下

1、fullname[0]的地址变化了,这里存的地址是字符串的地址,字符串改变之后,其指向新的字符串地址,所以这里的地址改变了
2、p.name的地址没有变,这里的地址是字符串数组name的地址,数组内部的值改变,但是数组的地址是不变的,所以这里的地址没变

img

1、fullname[0]的地址变化了,这里存的地址是字符串的地址,字符串改变之后,其指向新的字符串地址,所以这里的地址改变了
2、p.name的地址没有变,这里的地址是字符串数组name的地址,数组内部的值改变,但是数组的地址是不变的,所以这里的地址没变

手电筒照在紫色透明玻璃,紫光线,照到镜子上折射到墙上,改变了玻璃颜色,墙上的光颜色随着变。
fullname[0] 手电筒,值是玻璃 ,Person镜子

String 本质是一个常量 你重新赋值会重新开辟内存空间 也就是堆