修改对象的成员变量的属性值,会不会影响对象自身
情景一: 初始化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了一个新对象