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对象当然也不例外,在前 ...
随机推荐
- SQL Server Reporting Service(SSRS) 第四篇 SSRS 常见问题总结
1. 如何让表头在每页显示(译) A. 打开高级模式: 在分组栏中点击Column Goups右侧的箭头选择高级模式; B. 找到第一个Static组 在Row Groups区域中(注意不是Colu ...
- JVM---概述
1.JVM架构 1.1 JVM组成: ClassLoader类加载器 : 将class文件加载到JVM内存中: Runtime Data Area运行时数据区域 : java程序运行时的内存区域: ...
- Integer代码分析
我们都知道Integer是int的封装类,提供了一些类型转换等工具方法,有一个-128-127的缓存,而且是final的. ----------------------------- 干货: Inte ...
- JavaScript高级程序设计--对象创建的三种方法
创建对象的三种方法: 1.工厂模式 工厂模式是软件工程领域广为人知的设计模式,这种模式抽象了创建具体对象的过程.下面是使用工厂函数创建对象的的一个例子. 2.构造函数: 从上面的例子中,我们看到构造函 ...
- 文件监控只FileSystemWatcher控件
FileSYstemWatcher控件是用来监控一个文件系统或监控文件变化.该控件会通知文件创建.修改.删除的消息,分别通过Created事件.Changed事件和Deleted事件来处理对应的操作 ...
- one + two = 3
读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =", ...
- css3实现iPhone滑动解锁
该效果的主要实现思路是给文字添加渐变的背景,然后对背景进行裁剪,按文字裁剪(目前只有webkit内核浏览器支持该属性),最后给背景添加动画,即改变背景的位置,背景动画效果如下(GIF录制时有卡顿,代码 ...
- Gremlin--一种支持对图表操作的语言
Gremlin 是操作图表的一个非常有用的图灵完备的编程语言.它是一种Java DSL语言,对图表进行查询.分析和操作时使用了大量的XPath. Gremlin可用于创建多关系图表.因为图表.顶点和边 ...
- Maven 私有库和本地库的安装与配置 Sonatype Nexus + Maven
环境:CentOS 7.0 Final.JDK8.Sonatype Nexus.Maven 虚拟机模拟IP:192.168.16.167 备注:root权限用户操作 前提:已安装 JDK8 并配置好了 ...
- js&jquery:添加事件的三种方法和常用的一些事件
一.添加事件的方法 1.EventTarget.addEventListener添加 获取事件目标元素,通过addEventListener函数添加 // Assuming myButton is a ...