一个关于引用的有关问题,以前一直误解,估计很多人也一直和小弟我的想法一样,直到现在也没真正弄明白,还请各位大神解惑,多谢了!

一个关于引用的问题,以前一直误解,估计很多人也一直和我的想法一样,直到现在也没真正弄明白,还请各位大神解惑,谢谢了!!!
package zjj.util.test;

import java.util.ArrayList;
import java.util.List;


public class RefrenceObjectChange {
public static void main(String[] args) {
Person person = new RefrenceObjectChange.Person();
String ea = person.getName();
ea.concat("bb");
System.out.println(person.getName());

List<String> li = person.getList();
li.add("bb");
for (String string : li) {
System.out.println(string);
}

}

static class Person
{
private String name = "aa";
private List<String> list;

public String getName() {
return name;
}

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

public List<String> getList() {
if(list == null)
{
list = new ArrayList<String>();
list.add("aa");
}
return list;
}

public void setList(List<String> list) {
this.list = list;
}

}
}


 为什么person.getName() 输出是aa,  而person.getList()是aa, bb   ???
按道理来说List<String> li = person.getList();中 li 只是对peron中list的一个拷贝,所以就算我修改li里面的值都应该对person里面的list的值没影响才对, 大神求解???

------解决思路----------------------
List<String> li = person.getList();
这个并不是什么拷贝,而是和list一样指向了同一个对象...
你返回不正是list所指对象的引用么
再赋值不是拷贝对象,而只是赋指针值,即java的引用


------解决思路----------------------
就是值类型与引用类型的问题。
简单得说值类型赋值就是你说的拷贝,两个变量毫无关系,随便改变哪一个另外一个不受影响

而引用类型,其实就是变量中保存的是一个对象的地址,而这个地址就是通往实际对象数据的“一条路”。。。
Person a = new Person(); Person b = a; 比如a这个变量保存的地址是“重庆市渝北区”,b这个时候也是“重庆市渝北区”了~。
那么对于这两个变量的所有操作,都是通过地址找到真正的数据后进行修改的,他们同一个地址当然是修改同一数据了~

所有基本类型都是值类型,所有对象都是引用类型。 String是对象,他是引用类型,但具备值类型的特征,简单说你赋值的时候就把他看作值类型
------解决思路----------------------
person对象在堆内存中,你只new了1个,所以只有1个,你能引用到这个对象,那么修改的也是这个对象的属性!问题出在string这个类,这个类的对象可不是一般的对象!这个类是不可变的,他里面的值是不会变的,即 "aa"是一个对象,而 "aabb"是另外一个对象,你的person对象中name变量指向了"aa",  String ea = person.getName();此时ea也指向了"aa"对象,
ea.concat("bb");此时ea指向了"aabb"对象。注意!"aa"对象是不会改变的,他里面的值还是"aa"!!!ea的引用指向了其他对象,person对象还是指向原来的!!!