# JVM 代码实战记录对象get,set方法

2020-12-11  本文已影响0人  丿易小易

日常操作现象

现象描述
在代码中,我们对一个实体对象 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修饰的

image

被final修饰的类是无法被继承
final char value[], 修饰的变量不可变,注意这里的不可变是指引用不可变,值是可变的。

相同情况的数据类型还有 Integer Long Float Double Byte 等

上一篇下一篇

猜你喜欢

热点阅读