java对象传递小解析
先上代码:
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 引用传递demo
* @author lishaohua
* time : 2016-3-24 下午5:10:49
*/
public class Demo1 {
private static Logger logger = LoggerFactory.getLogger(Demo1.class); //设置属性...
public void setStudentParams(Student stu) {
stu.setName("张三");
stu.setStuNo("0001");
} /**
* 测试...
* @param args
*/
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
Student stu = new Student("0000", "李四");
logger.info("更新前------>" + stu.toString());
demo1.setStudentParams(stu);
logger.info("更新后------>" + stu.toString());
} } /**
* 辅助类:学生类
*
* @author lishaohua
* time : 2016-3-24 下午5:13:58
*/
class Student { private String stuNo; //学号 private String name; //姓名 //默认构造
public Student() {} //构造方法
Student(String stuNo, String name) {
super();
this.stuNo = stuNo;
this.name = name;
} public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
} public String getStuNo() {
return stuNo;
} public void setStuNo(String stuNo) {
this.stuNo = stuNo;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
执行
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了一把。
重新运行:
17:45:08.330 [main] INFO c.s.masopen.integration.demo.Demo1 - 更新前------>Student[stuNo=0000,name=李四]
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),否则整个对象的属性不会做任何修改;
java对象传递小解析的更多相关文章
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
- Java对象 json之间的转换(json-lib)
在这里主要简单的介绍一下,如何使用json-lib这个工具包来完成Java对象(或集合)与json对象(或集合)之间的转换~ 1. Java对象转换成json(既创建json) 关键类:JSONObj ...
- jxcel - 好用的Excel与Java对象转换工具
更多精彩博文,欢迎访问我的个人博客 Jxcel简介 Jxcel是一个支持Java对象与Excel(目前仅xlsx.xls)互相转换的工具包. 项目地址:https://github.com/jptan ...
- JSON数据与Java对象的相互转换
JSON数据与Java对象的相互转换 JSON解析器 常见的解析器:Jsonlib .Gson. fastjson. jackson JSON转化为Java对象 使用步骤: 1.导入jackson的相 ...
- 不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller
摘要:将XML文档与JAVA对象互转是很常见的需求,如果XML定义很规整这很好实现.然而在现实中“不规矩”的XML可能更常见,Marshaller便无能为力了吗?下面是一个小技巧,调整一下思维便能重用 ...
- Android Studio NDK 新手教程(5)--Java对象的传递与改动
概述 本文主要Java与C++之间的对象传递与取值.包括传递Java对象.返回Java对象.改动Java对象.以及性能对照. 通过JNIEnv完毕数据转换 Java对象是存在于JVM虚拟机中的,而C+ ...
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
转自:http://kakajw.iteye.com/blog/935226 一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是 ...
- java对象Integer不能引用传递
java对象Integer不能引用传递 /** * The value of the <code>Integer</code>. * * @serial */ private ...
- Binder机制,从Java到C (5. IBinder对象传递形式)
1.IBinder的传递 Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式來传递.IBinder对象当然也不例外,在前 ...
随机推荐
- 数据结构---Java---LinkedList
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, D ...
- Mybatis学习笔记2 - 解析config
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- c++ 和 matlab 下的caffe模型输入差异
在向一个caffe模型传递输入数据的时候,要注意以下两点: 1. opencv中Mat数据在内存中的存放方式是按行存储,matlab中图像在内存中的存放方式是按列存储. 2. opencv中Mat数据 ...
- 斗鱼扩展--localStorage备份与导出(九)
之前我们都把数据 放在了 localStorage 里,但扩展一旦卸载,数据就会被清空, 在Console里备份,一次只能输出一条,小白操作起来很不方便,所以能不能 导入,导出文件来进行备份还原呢? ...
- Mysql显示行号
SELECT `Name`,(@rowNum:=@rowNum+1) AS rowNo FROM bas_student,(SELECT (@rowNum :=0)) a LIMIT 10;
- Spring框架中stopwatch(秒表)
StopWatch对应的中文名称为秒表,经常我们对一段代码耗时检测的代码如下: long startTime = System.currentTimeMillis(); // 你的业务代码 long ...
- Shader笔记
1,渲染队列值小的先渲染,值大的后渲染 2,zTest,zWrite zTest:LEqua zWrite:On 则:zWrite中,深度值小于深度值缓冲区的值会被通过 参考:http://www.c ...
- Struts2_Action和Result总结
Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...
- centos6.5_64bit_tomcat7开机自启
一.创建tomcat脚本 vim /etc/init.d/tomcat 将下面的内容拷到脚本里面 =================================================== ...
- 03、IDEA下Spark API编程
03.IDEA下Spark API编程 3.1 编程实现Word Count 3.1.1 创建Scala模块 3.1.2 添加maven支持,并引入spark依赖 <?xml version=& ...