码迷,mamicode.com
首页 > 编程语言 > 详细

java对象传递小解析

时间:2016-03-24 18:31:52      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

先上代码:

 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=李四]

 

分析总结:

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

 

java对象传递小解析

标签:

原文地址:http://www.cnblogs.com/huahua035/p/5316472.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!