个人理解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]总是同一个东西(一个字符串的引用)
也就是说这个字符串的引用现在可用两种方式访问, 当你用一种方式修改了它的指向, 那么你用另一种方式访问到的它自然其指向已经被修改.
Sign in to make a reply
用户6666089257
个人理解java的引用就是C++中的指针, 只不过不需要解引用运算符*而已. 引用指向的就是内容的地址, 而引用之间的赋值也就是将一个引用指向的地址赋给另一个. 另外还有个常量池的概念, 对于程序中出现的字符串, java会先将它们保存在常量池中, 而指向它们的引用实际上所存储的是字符串所在的地址.
这时候s2和s1已经没有关系了, 改s1不影响s2, 这就是为什么参数那里输出的是两个"Bob".
而对于传参的第二个例子
setName()调用后, Person.name和外面的fullname这两个引用指向的是同一个数组. 也就是说Person.name[0]和外面的fullname[0]总是同一个东西(一个字符串的引用)