先上代码:
1 importorg.apache.commons.lang.builder.ToStringBuilder;2 importorg.apache.commons.lang.builder.ToStringStyle;3 importorg.slf4j.Logger;4 importorg.slf4j.LoggerFactory;5
6 /**
7 * 引用传递demo8 *@authorlishaohua9 * time : 2016-3-24 下午5:10:4910 */
11 public classDemo1 {12 private static Logger logger = LoggerFactory.getLogger(Demo1.class);13
14 //设置属性...
15 public voidsetStudentParams(Student stu) {16 stu.setName("张三");17 stu.setStuNo("0001");18 }19
20 /**
21 * 测试...22 *@paramargs23 */
24 public static voidmain(String[] args) {25 Demo1 demo1 = newDemo1();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 *@authorlishaohua38 * time : 2016-3-24 下午5:13:5839 */
40 classStudent {41
42 private String stuNo; //学号
43
44 private String name; //姓名45
46 //默认构造
47 publicStudent() {}48
49 //构造方法
50 Student(String stuNo, String name) {51 super();52 this.stuNo =stuNo;53 this.name =name;54 }55
56 publicString toString() {57 return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);58 }59
60 publicString getStuNo() {61 returnstuNo;62 }63
64 public voidsetStuNo(String stuNo) {65 this.stuNo =stuNo;66 }67
68 publicString getName() {69 returnname;70 }71
72 public voidsetName(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 voidsetStudentParams(Student stu) {
stu= newStudent();
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),否则整个对象的属性不会做任何修改;