Discuss / Java / 关于引用

关于引用

Topic source

个人理解java的引用就是C++中的指针, 只不过不需要解引用运算符*而已. 引用指向的就是内容的地址, 而引用之间的赋值也就是将一个引用指向的地址赋给另一个. 另外还有个常量池的概念, 对于程序中出现的字符串, java会先将它们保存在常量池中, 而指向它们的引用实际上所存储的是字符串所在的地址. 

String s1 = "Hello"; // java在常量池中储存"Hello"串, 然后将其串所在地址给s1记着
String s2 = s1; // 将s1所记的地址赋给s2, 现在s2和s1都指向串"Hello"
String s1 = "world"; // java在常量池中储存"world"串, s1现在指向的就是它的地址, s2还是指向"Hello"的地址

这时候s2和s1已经没有关系了, 改s1不影响s2, 这就是为什么参数那里输出的是两个"Bob".

而对于传参的第二个例子

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;
    }
}

setName()调用后, Person.name和外面的fullname这两个引用指向的是同一个数组. 也就是说Person.name[0]和外面的fullname[0]总是同一个东西(一个字符串的引用)

也就是说这个字符串的引用现在可用两种方式访问, 当你用一种方式修改了它的指向, 那么你用另一种方式访问到的它自然其指向已经被修改.


  • 1

Reply