日常操作现象
现象描述
在代码中,我们对一个实体对象 Student中的参数实体teacher 进行修改属性时,
不需要将teacher对象重新set到对象Student中, 直接调用student.getTeacher(),
会发现返回的值与我们前面修改的teacher的值是一样的!
而修改Student中的非实体对象name参数, 再getName()时,发现并没有变化
代码如下:
@Data
public class Teacher {
private String name;
private Integer age;
}
@Data
@Builder
public class Student {
private Teacher teacher;
private String name;
private Integer age;
}
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.setName("王老师");
teacher.setAge(39);
Student student = Student.builder().teacher(teacher).name("小王").age(18).build();
Teacher teacher1 = student.getTeacher();
teacher1.setAge(33);
String name = student.getName();
name= "王同学";
System.out.println(student.getTeacher().getAge());
System.out.println(student.getName());
}
结果:
33
小王
原因分析
teacher实体对象都是在jvm的堆内存中,
而student中的teacher对象参数,只是一个引用,
所以teacher1实际与Student中的teacher对象是同一个
当我们对teacher1所引用的对象进行修改时, 也就改变了teacher对象
而student中name是String类型, 其底层是 被final修饰的
被final修饰的类是无法被继承
final char value[], 修饰的变量不可变,注意这里的不可变是指引用不可变,值是可变的。
相同情况的数据类型还有 Integer Long Float Double Byte 等