日常操作現(xiàn)象
現(xiàn)象描述
在代碼中,我們對一個實體對象 Student中的參數(shù)實體teacher 進(jìn)行修改屬性時,
不需要將teacher對象重新set到對象Student中, 直接調(diào)用student.getTeacher(),
會發(fā)現(xiàn)返回的值與我們前面修改的teacher的值是一樣的!
而修改Student中的非實體對象name參數(shù), 再getName()時,發(fā)現(xiàn)并沒有變化
代碼如下:
@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= "王同學(xué)";
System.out.println(student.getTeacher().getAge());
System.out.println(student.getName());
}
結(jié)果:
33
小王
原因分析
teacher實體對象都是在jvm的堆內(nèi)存中,
而student中的teacher對象參數(shù),只是一個引用,
所以teacher1實際與Student中的teacher對象是同一個
當(dāng)我們對teacher1所引用的對象進(jìn)行修改時, 也就改變了teacher對象
而student中name是String類型, 其底層是 被final修飾的
被final修飾的類是無法被繼承
final char value[], 修飾的變量不可變力九,注意這里的不可變是指引用不可變萝毛,值是可變的鹉胖。
相同情況的數(shù)據(jù)類型還有 Integer Long Float Double Byte 等