修改对象的成员变量的属性值,会不会影响对象自身
情景一: 初始化java对象,并修改此对象中子对象的属性
对象中的子对象都是new出来的
@Data
public class Teacher {
private String name;
private int age;
private List<Student> students;
}
@Data
public class Student {
private String name;
private int age;
}
初始化:
-
1.创建Teacher对象 2.创建Student集合,并add自己new出来的Student对象 3.将Teacher中成员变量students与Student集合关联
// 初始化教师对象
private static Teacher init() {
Teacher t = new Teacher();
t.setName("张三");
t.setAge(1);
ArrayList<Student> students = new ArrayList<>();
Student s1 = new Student();
s1.setName("李四");
s1.setAge(2);
students.add(s1);
Student s2 = new Student();
s2.setName("王五");
s2.setAge(3);
students.add(s2);
t.setStudents(students);
return t;
}
测试:
-
1.从teacher对象中获取student集合中第一个student对象 2.修改student中的属性 3.观察teacher对象的属性变化
public static void main(String[] args) {
Teacher t = init();
List<Student> students = t.getStudents();
Student s1 = students.get(0);
s1.setAge(4);
System.out.println(t);
}
teacher对象也随之改变
原理: 我们看一下在init方法中,我们一共初始化了4个对象,这4个对象都有自己的地址值 (1) teacher对象引用了students 的地址值 (2)students引用了s1和s2的地址值
所以当我们通过t拿到students ,在通过students拿到s1,然后修改了s1后,因为地址值并没有变动,所以打印t时,就会显示新的s1的值
情景二: 初始化JSONObject对象,并修改其中子对象的属性
public static void main(String[] args) {
JSONObject jsonObject = JSONObject.parseObject("{"name":"张三","age":1,"students":[{"name":"李四","age":2,},{"name":"王五","age":2,}]}");
JSONArray students = jsonObject.getJSONArray("students");
JSONObject student = students.getJSONObject(0);
student.put("age",4);
System.out.println(jsonObject);
}
我们使用JSONObject.parseObject方法将字符串转成JSONObject对象时,也会根据层级,一层一层的去初始化对象,他们之间互相引用的仅仅只是地址值
情景三: 初始化JSONObject对象,并修改其中子对象的属性
JSONObject jsonObject = new JSONObject();
jsonObject.put("students","[{"name":"李四","age":2,},{"name":"王五","age":2,}]");
JSONArray students = jsonObject.getJSONArray("students");
JSONObject student = students.getJSONObject(0);
student.put("age",4);
System.out.println(jsonObject);
这是因为我们存的是String类型的,我们在getJSONArray(“students”),才会将字符串初始化成对象,但是jsonObject中保存的还是字符串
情景四: 修改JSONObject中对象的属性_情况3
JSONObject jsonObject = new JSONObject();
JSONArray students= new JSONArray();
JSONObject s1= new JSONObject();
s1.put("name", "李四");
s1.put("age", "2");
students.add(s1);
JSONObject s2= new JSONObject();
s2.put("name", "王五");
s2.put("age", "3");
students.add(s2);
jsonObject.put("students",students);
JSONArray students = jsonObject.getJSONArray("students");
JSONObject student = students.getJSONObject(0);
student.put("age",4);
System.out.println(jsonObject);
我们看一下这个方法就懂了,如果存的本来就是JSONArray返回的是此对象(地址值),如果是String,则是new了一个新对象
