美文网首页
# JVM 代码实战记录对象get,set方法

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

作者: 丿易小易 | 来源:发表于2020-12-11 13:13 被阅读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 等

    相关文章

      网友评论

          本文标题:# JVM 代码实战记录对象get,set方法

          本文链接:https://www.haomeiwen.com/subject/nyjjgktx.html