对象的引用传递和值传递
对象 引用 传递
2023-09-14 09:07:25 时间
我们在开发的过程中,经常会遇见对象的值传递,和对象的引用传递,老是分不清楚。
今天以下面两个例子,结合内存分析,来讲解值传递和引用传递。
值传递
源代码
/**
* Created By zby on 20:46 2022/7/27
* 学生类
*/
public class Student{
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void changeStudentName(Student s) {
s = new Student();
s.setName("nihao");
}
public static void main(String[] args) {
1 Student student = new Student();
2 student.setName("珠宝呀");
3 *System.out.println(student.getName());*
4 student.changeStudentName(student);
5 *System.out.println(student.getName());*
}
}
output:
珠宝呀
珠宝呀
输出结果:
你会发现,即便我调用了changeStudentName
方法,其输出结果也是一样的,为什么会这样呢?
语句1
我们来画一个类加载的JVM结构图,当我们执行语句1
时,首先会在栈里分配一个地址空间存储指向student对象1的引用的首地址:
语句2
当我们执行语句2
的时候,在栈里面分配一个临时变量name,临时变量存储是常量池当中的“珠宝”
的地址,而通过set方法中的this.name=name
,此时对象的属性存储的临时变量的副本地址,通过这个方法可得:
String p="珠宝呀";
student.setName(p);
student.setName("珠宝");
System.out.println("student-->"+student.getName());
System.out.println("p-->"+p);
output:
student-->珠宝
p-->珠宝呀
发现p的值并不没改变,而对象name重新获取新的副本。这个是按值传递。
语句4
当方法执行语句4
时:此时获取了student对象的副本
,副本指向了新的Student对象,并且set了新的名字,而Student初值并没有改变,因而,输出的结果是没有改变。
引用传递
如果将StudentName的返回对象改变了,就会出现不同的结果:
public Student changeStudentName(Student s) {
s = new Student();
s.setName("nihao");
return s;
}
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.getName());
String p="珠宝呀";
student.setName(p);
student.setName("珠宝");
System.out.println("student-->"+student.getName());
System.out.println("p-->"+p);
student = student.changeStudentName(student);
System.out.println("student-->"+student.getName());
}
output:
student-->珠宝
p-->珠宝呀
student-->nihao
输出结果:
因为,通过调用 student.changeStudentName(student);
这个方法,返回的是一个新的对象的引用,而student重新指向了新的引用对象,故而,值就被改变了。这个是按引用传递数据。
总结
通过以上两段代码的分析,应该对值传递和引用传递,有个大致的了解了。
相关文章
- javascript原始值和对象引用
- 【C/C++学院】0831-类与对象的异常/面试100题1-100
- 【C/C++学院】0820-Nullptr/const对象/类指针引用以及mallocfree与newde/类重载运算符/QT加法重载/类的重载赋值运算/自增在前在后差别/赋值重载深浅拷贝/重载下标
- js中判断对象是否为空的三种实现方法
- 细说JavaScript对象(3):hasOwnProperty
- (六)对象引用、可变性和垃圾回收
- 【外部节点】json判断@表示正在处理的当前数组项或对象。过滤器还可用于$引用当前对象之外的属性
- java: Comparable比较器,数组对象比较器
- 使用NSHashTable存储引用对象
- JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- 基于Python对象引用、可变性和垃圾回收详解
- 基于Python对象引用、可变性和垃圾回收详解
- 基于Python对象引用、可变性和垃圾回收详解
- jquery遍历:数组、对象、json
- Python - 使用objgraph生成对象引用关系图
- OpenCV每日函数 对象追踪模块 卡尔曼滤波器
- js对象的引用传递在react中的使用注意事项
- Jackson使用示例:将Java对象转换成Map
- 集合类操作:未将对象引用设置到对象的实例
- C# 对象比较(值类型、引用类型)
- Hibernate从入门到放弃(三)----持久化对象
- C# 对象比较(值类型、引用类型)
- List 去重对象
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- javascript---对象和函数的引用、浅拷贝、深拷贝、递归
- python 将一个JSON 字典转换为一个Python 对象
- js函数与对象关系快速记忆
- C++通过引用来传递和返回类对象(四十二)
- ADO.NET入门教程(七) 谈谈Command对象高级应用
- java比较两个对象是否相等
- 注意:在对象变量中存放的是引用(地址);在简单变量中存放的是数值。
- 访问 JavaBean 对象的属性
- 对象的常引用
- 引用多个对象的成员
- Array对象的方法实现(6)----Array.prototype.indexOf(实现常规参数的功能)
- 第9讲:Python列表对象查操作之通过索引获取列表中的元素