• 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),否则整个对象的属性不会做任何修改;

  • 相关阅读:
  • 原文地址:https://www.cnblogs.com/huahua035/p/5316472.html
  • 最新文章
  • 热门文章
一二三 - 开发者的网上家园