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对象当然也不例外,在前 ...
随机推荐
- Silverlight TreeView 带 checkbox和图片
前段时间做Silverlight TreeView 控件,但是要带checkbox和图片,在网上到处找相关的例子,效果图如下 xaml代码 <UserControl x:Class=" ...
- 晶振电路的设计-AN2867学习
一 石英晶体的等效电路.带宽: FS~FA之间就是并联带宽,越窄稳定性越好.其中Fs.Fa为Lm/Rm/Cm电抗分别为0和无穷大时的谐振频率).Fp为工作频率(通过调整负载电容CL来达到中心频率) 起 ...
- 用一层for循环初始化三维数组
][][]; ; i < * * ; i++) { a[i / ][(i / ) % ][i % ] = i; printf(, (i / ) % , i % ); // printf(&quo ...
- nginx+keepalived主辅切换(监控脚本在keepalived.conf中执行)
以前写过一篇,nginx+keepalived 双机互备的文章,写那篇文章的时候没有想过如果apache或者nginx 挂了,而 keepalived 或者 机器没有死,那么主辅是不会切换的,今天就研 ...
- java学习第十三天
1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类.StringBuffer供我们使 ...
- plupload2.1.2文件合并
1.前端 (1)依赖文件: <link type="text/css" rel="stylesheet" href="~/Content/plu ...
- xml解析demo使用
package lianxi; import java.io.FileOutputStream;import java.io.OutputStreamWriter; import javax.xml. ...
- python的变量命名及其使用
以下内容皆从书本自学 ,归纳. 1. 变量名只能包含字母.数字和下划线.变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message. 2. ...
- ueditor 插件问题
- Vue Element-ui 框架:路由设置 限制文件类型 表单验证 回车提交 注意事项 监听事件
1.验证上传文件的类型: (1)验证图片类型 <template> <el-upload class="avatar-uploader" action=" ...