序
这块内容网上一搜一大片,但还是自己的理解和亲身测验更靠谱一些。
引用传递1
public class Demo {
public static void main(String[] args) {
Person per = new Person("01", "UUUUU");
changePer(per);
System.out.println(per);
}
private static void changePer(Person per) {
per.setName("UIASUIAS");
}
}
结果:
Person{id='01', name='UIASUIAS'}
Process finished with exit code 0
显然,这是引用传递,另外解释一下JVM,方法区存在的是这个person 的描述(也可称之为一个模型),new person()的实例对象存在堆内存中,堆中可以存在多个person的实例。
引用传递2
public class Demo {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
Person per = new Person("01", "UUUUU");
list.add(per);
System.out.println(JSON.toJSONString(list));
per.setName("PPPPPPPPp");
System.out.println(JSON.toJSONString(list));
change(list);
System.out.println(JSON.toJSONString(list));
}
public static void change(ArrayList<Person> list){
list.get(0).setName("TTTT");
}
}
结果:
[{"id":"01","name":"UUUUU"}]
[{"id":"01","name":"PPPPPPPPp"}]
[{"id":"01","name":"TTTT"}]
Process finished with exit code 0
显然2,不仅在list.add()后修改list中的对象为引用传递,把list当做参数传给方法也为引用传递,list.get(0)还是获得了main方法里person的引用地址
引用传递3
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
Person per = new Person("01", "UUUUU");
list.add(per);
ArrayList<Person> list1 = new ArrayList<>();
list1.addAll(list);
System.out.println(JSON.toJSONString(list1));
per.setName("PPPPPPPPp");
System.out.println(JSON.toJSONString(list1));
}
结果:
[{"id":"01","name":"UUUUU"}]
[{"id":"01","name":"PPPPPPPPp"}]
Process finished with exit code 0
显然3,这个也是引用传递