java 传递对象_java对象传递小解析

先上代码:

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", "李四");

80634103f08e5756441f32afdcef69bc.png

注意右上角stu对象的ID=20

第二行打印:更新前------>Student[stuNo=0000,name=李四]

第三行重新赋值,调试信息如下图

996b24eaf98046ba595a719d3547a88e.png

注意,该方法由于重新new了一把对象,stu对象的ID=32

第四行打印,调试信息如下图:

13cce34592f8cbe7f3c1ecb996d1405a.png

注意右上角对象stu 的ID=20

打印信息为:更新后------>Student[stuNo=0000,name=李四]

分析总结:

1.引用传递前,请先初始化该对象(new,堆中创建);

2.引用传递,在整个对象传递过程中(方法调用),传递对象必须保持不变(不能被重新new),否则整个对象的属性不会做任何修改;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值