为了账号安全,请及时绑定邮箱和手机立即绑定

用对象的get方法获得属性,修改这个属性,但没用set赋值,为什么这个对象里面的属性会被影响到?

用对象的get方法获得属性,修改这个属性,但没用set赋值,为什么这个对象里面的属性会被影响到?

慕粉4241372 2017-05-15 15:57:41
Grade g = new Grade("二班", "mysql基础班"); Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); Student student = session.get(Student.class, 1); Set<Student> students = g.getStudents(); students.add(student); System.out.println("长度是:"+g.getStudents().size()); session.save(g); transaction.commit(); HibernateUtil.closeSession(session);这段代码中,g是新建的对象,它有4个属性,构造方法赋了两个值,还有一个set集合的属性,这个set集合是空的吧,现在用get方法获得这个集合,并往里面添加一个对象,所以这个集合长度变为1了。但我并没有把这个集合set给g对象,所以g对象里面的set集合应该还是空的呀但我再get一次set集合,他的长度却是1????为什么??
查看完整描述

3 回答

?
botao555

TA贡献48条经验 获得超46个赞

你的Grade类的代码是什么样的?

或者你在Grade g = new Grade("二班", "mysql基础班"); 这一行下面先打印下

System.out.println("长度是:"+g.getStudents().size()); 确认下是不是Grade类的students是不是空的。

按照上面你给的代码,Set<Student> students 这个引用并没有对Grade的实例g产生影响,理论上g.getStudents的大小不应该变化。

查看完整回答
1 反对 回复 2017-05-15
  • 慕粉4241372
    慕粉4241372
    我这个g对象都是刚new出来的,除了构造函数里面赋的值,其他的当然是空呀
  • botao555
    botao555
    好吧,是我理解错了,你的Set<Student> students = g.getStudents(); 拿到的是g的成员变量students的引用,也就是说你每次调用 g.getStudents()拿到的都是同一个Set的实例,所以add之后再调用 g.getStudents()长度自然会变成1了。不信的话,你可以打印一下 System.out.println(students.hashCode()==g.getStudents().hashCode()); 看看两个对象的hash值是否一样,一样就说明是同一个引用。
?
幕附

TA贡献78条经验 获得超18个赞


我觉得是get和load的区别


查看完整回答
反对 回复 2017-05-15
  • 3 回答
  • 0 关注
  • 3215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信