1、java中的对象赋值、函数传参、集合元素添加等都是引用传递,即目标变量还是指向原先的对象,目标变量修改对象的成员变量时,即是修改原先的对象,验证代码如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Person{
private int id;
private String name;
private int age;
}
public static void ageAdd(Person person) {
person.setAge(person.getAge() + 1);
}
public static void main(String[] args) {
Map<Integer, Person> map = new HashMap<>();
Person p = new Person(1, "鸣人", 8);
System.out.println(JSON.toJSONString(p)); // {"age":8,"id":1,"name":"鸣人"}
/// 赋值给另一变量
Person p2 = p;
p2.setAge(p2.getAge() + 1);
System.out.println(JSON.toJSONString(p)); // {"age":9,"id":1,"name":"鸣人"}
/// 赋值给函数入参
ageAdd(p);
System.out.println(JSON.toJSONString(p)); // {"age":10,"id":1,"name":"鸣人"}
/// 添加到集合中
map.put(p.getId(), p);
map.get(p.getId()).setAge(p.getAge() + 1);
System.out.println(JSON.toJSONString(map.get(p.getId()))); // {"age":11,"id":1,"name":"鸣人"}
}
注意:当原始变量指向的对象被添加到集合中,原始变量又被赋予新的对象,此时集合中的对象不受影响,即不会被销毁也不会变成新的对象 (集合元素可以理解为指向对象的变量,即集合中存储的实际是指向对象的地址,这个地址还在使用就说明其指向的对象还在使用,不会被虚拟机回收) !!!
2、java方法的传参为对象时,是引用类型,在方法中修改该传参会改变原始对象的值: