Java是“值传递”还是“引用传递”?
2024-09-08 06:49:51
本文是根据stackoverflow网站上的一道题目整理出来的。
Java一直是“值传递”而不是引用传递。看一个例子:
public class Main{
public static void main(String[] args){
Foo f = new Foo("f");
changeReference(f); //不改变引用
modifyReference(f); //会修改变量f指向的对象
}
public static void changeReference(Foo a){
Foo b = new Foo("b");
a = b;
}
public static void modifyReference(Foo c){
c.setAttribute("c");
}
}
我们来一步步分析这个例子:
1、 声明一个类型Foo的引用f,并将其指向一个带有属性`“f”`的类型Foo的新对象。
Foo f = new Foo("f");
2、方法方面,声明了一个名为a的Foo
类型的引用,初始化的值为null。
public static void changeReference(Foo a)
3、 当你调用方法changeReference时,引用a将指向作为参数传递过来的对象。
changeReference(f);
4、声明一个名为b的Foo类型的引用,指向一个包含属性“b”的新Foo对象。
Foo b = new Foo("b");
5、 a=b 是将引用a重新指向了含有属性“b”的对象,而不会影响引用f。
6、当你调用方法modifyReference(Foo c)时,创建引用c并将其指向含有属性“f”的对象。
7、 c.setAttribute("c") 会改变引用c所指向的对象的属性,而它与f指向的是同一个对象。
总结如下:
- 对象是引用就是一个变量,其中包含的数据可以告知JVM如何在内存(堆)中获得被引用的对象。
- 当给一个方法传递参数的时候,你传递的并不是引用变量,而且该变量的数据的拷贝,即该引用变量的值。
- 传递的是引用的值,而不是引用本身,更不是对象。
- 可以根据传递的值访问并修改对象的内容,但是不能改变原本的引用变量的指向。
最新文章
- 将 Book-Crossing Dataset 书籍推荐算法中 CVS 格式测试数据集导入到MySQL数据库
- Gson解析的小例子
- JS获取上传文件的名称、格式、大小
- 修改Hosts后对火狐不起作用解决办法
- Mysql 死锁相关操作
- LED灯开关电路
- linux调度器系列
- Linux下查看显卡型号
- 京东区块排版负margin用法
- oracle复制表数据,复制表结构
- easy_install MySQL-python
- 关于TCP/IP协议栈(转)
- 学习笔记TF063:TensorFlow Debugger
- Docker镜像管理基础与基于容器的镜像制作示例
- 解决和排查 ";必须使用适当的属性和方法修改 User-Agent"; 错误时遇到的一些坑
- BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
- Nginx使用教程(一):Nginx编译参数详解
- Git(五)IDEA应用Git
- .NET轻量级ORM组件Dapper葵花宝典
- spring-cloud/spring-cloud-sleuth github 项目 mark