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

分析总结:

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

时间: 2024-08-08 00:19:05

java对象传递小解析的相关文章

java 对象传递 是 值传递 还是 引用传递?

这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用传递.这个理论是说java的对象作为参数的时候传递过去的是地址的值,而不是对象本身,所以这也是值传递. 看完这个理论我真是有点纳闷啊,c++中从来也没说过引用传递传递的是对象本身啊,传递的也是地址值. 这么说来c++中也没有引用传递了? 我感觉这个就是个文字游戏罢了,大家说的都是一样的东西,还非要争

Java对象排序小测试

import java.util.ArrayList; import java.util.Collections; import java.util.List; /**  * Java对象排序  */ public class User implements Comparable<User> {     private int idx;     public User(int idx) {         this.idx = idx;     }     public int getIdx(

借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Parcelable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import android.os.Parcel; import android.os.Parcelable; public cl

借助Intent实现Android工程中Activity之间Java对象的传递——实现Serializable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Serializable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import java.io.Serializable; public class User implements Seria

Java对象 json之间的转换(json-lib)

在这里主要简单的介绍一下,如何使用json-lib这个工具包来完成Java对象(或集合)与json对象(或集合)之间的转换~ 1. Java对象转换成json(既创建json) 关键类:JSONObject jsonObject = JSONObject.from(Object obj); 使用说明:只要将Java对象传入方法,那么便可以得到一个JSONObject,然后你便可以直接json.toString();输出json~ 例子: @Test public void testCreateJ

一个java对象占多少内存空间

最近在做flex,需要封装一个事件单pojo对象进行展现.想想数据库里6000多条记录,封装多了肯定会占用很大内存,并且flex对象完全是从java对象传递过来再次封装的,也就是两倍的内存量.所以有了标题的考虑,那么一个java pojo对象到底占多少内存呢.如下题所示: Object o=new Object(): 在java中空对象占八个字节,对象的引用占四个字节.所以上面那条语句所占的空间是4byte+8byte=12byte.java中的内存是以8的倍数来分配的,所以分配的内存是16by

JSON数据与Java对象的相互转换

JSON数据与Java对象的相互转换 JSON解析器 常见的解析器:Jsonlib .Gson. fastjson. jackson JSON转化为Java对象 使用步骤: 1.导入jackson的相关jar包 2.创建jackson核心对象ObjectMapper 3.使用ObjectMapper的相关方法进行转换 1.readValue(json字符串数组,Class) Java转化为JSON对象 使用步骤 1.导入jackson的相关jar包 2.创建jackson核心对象ObjectMa

Android Studio NDK 入门教程(5)--Java对象的传递与修改

概述 本文主要Java与C++之间的对象传递与取值.包括传递Java对象.返回Java对象.修改Java对象.以及性能对比. 通过JNIEnv完成数据转换 Java对象是存在于JVM虚拟机中的,而C++是脱离JVM而运行的,如果在C++中访问和使用Java中的对象,必然会使用JNIEnv这个桥梁.其实通过下面的代码很容易看出,这种访问方式和Java中的反射十分雷同. 这里定义一个简单Java对象用于下文测试: package com.example.wastrel.hellojni; /** *

页面传递Json对象,后台解析

使用的组件 前台组件:json2.js  来自 http://www.json.org/js.html 后台组件:json-lib-2.2.2-jdk15.jar 前台代码 1 通过页面生成json对象列表,然后转换成字符串 // 生成json对象 转字符串 function makeTsJsonParam(){ var tsList = new Array(); var ts = {'tn_id':'','tn_trainSortie':'','tn_takeOffTime':'','tn_l