修改对象的成员变量的属性值,会不会影响对象自身

情景一: 初始化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了一个新对象

经验分享 程序员 微信小程序 职场和发展