java对象传递小解析
先上代码:
1 import org.apache.commons.lang.builder.ToStringBuilder; 2 import org.apache.commons.lang.builder.ToStringStyle; 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 /** 7 * 引用传递demo 8 * @author lishaohua 9 * time : 2016-3-24 下午5:10:49 10 */ 11 public class Demo1 { 12 private static Logger logger = LoggerFactory.getLogger(Demo1.class); 13 14 //设置属性... 15 public void setStudentParams(Student stu) { 16 stu.setName("张三"); 17 stu.setStuNo("0001"); 18 } 19 20 /** 21 * 测试... 22 * @param args 23 */ 24 public static void main(String[] args) { 25 Demo1 demo1 = new Demo1(); 26 Student stu = new Student("0000", "李四"); 27 logger.info("更新前------>" + stu.toString()); 28 demo1.setStudentParams(stu); 29 logger.info("更新后------>" + stu.toString()); 30 } 31 32 } 33 34 /** 35 * 辅助类:学生类 36 * 37 * @author lishaohua 38 * time : 2016-3-24 下午5:13:58 39 */ 40 class Student { 41 42 private String stuNo; //学号 43 44 private String name; //姓名 45 46 //默认构造 47 public Student() {} 48 49 //构造方法 50 Student(String stuNo, String name) { 51 super(); 52 this.stuNo = stuNo; 53 this.name = name; 54 } 55 56 public String toString() { 57 return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); 58 } 59 60 public String getStuNo() { 61 return stuNo; 62 } 63 64 public void setStuNo(String stuNo) { 65 this.stuNo = stuNo; 66 } 67 68 public String getName() { 69 return name; 70 } 71 72 public void setName(String name) { 73 this.name = name; 74 } 75 76 }
执行
17:43:26.593 [main] INFO c.s.masopen.integration.demo.Demo1 - 更新前------>Student[stuNo=0000,name=李四]
17:43:26.598 [main] INFO c.s.masopen.integration.demo.Demo1 - 更新后------>Student[stuNo=0001,name=张三]
解析:
Student stu = new Student("0000", "李四"); logger.info("更新后------>" + stu.toString()); demo1.setStudentParams(stu); logger.info("更新后------>" + stu.toString());
第一行创建了1个对象stu: Student stu = new Student("0000", "李四");
第二行打印该对象信息: 更新前------>Student[stuNo=0000,name=李四]
第三行重新设置该对象属性:
第四行打印对象信息: 更新后------>Student[stuNo=0001,name=张三]
为了说明问题,我们现在对代码做更改:
更改地方1:
//设置属性... public void setStudentParams(Student stu) { stu = new Student(); stu.setName("张三"); stu.setStuNo("0001"); }
很简单:设置属性的方法中,我们对传递过来的对象重新new了一把。
重新运行:
1 17:45:08.330 [main] INFO c.s.masopen.integration.demo.Demo1 - 更新前------>Student[stuNo=0000,name=李四] 2 17:45:08.334 [main] INFO c.s.masopen.integration.demo.Demo1 - 更新后------>Student[stuNo=0000,name=李四]
很明显,这次对象经过属性重新设置后,没有发生引用传递!
单步调试一下,看对象的值:
第一行创建了1个对象stu: Student stu = new Student("0000", "李四");
注意右上角stu对象的ID=20
第二行打印:更新前------>Student[stuNo=0000,name=李四]
第三行重新赋值,调试信息如下图
注意,该方法由于重新new了一把对象,stu对象的ID=32
第四行打印,调试信息如下图:
注意右上角对象stu 的ID=20
打印信息为:更新后------>Student[stuNo=0000,name=李四]
分析总结:
1.引用传递前,请先初始化该对象(new,堆中创建);
2.引用传递,在整个对象传递过程中(方法调用),传递对象必须保持不变(不能被重新new),否则整个对象的属性不会做任何修改;