本文是根据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指向的是同一个对象。

总结如下:

  1. 对象是引用就是一个变量,其中包含的数据可以告知JVM如何在内存(堆)中获得被引用的对象。
  2. 当给一个方法传递参数的时候,你传递的并不是引用变量,而且该变量的数据的拷贝,即该引用变量的值。
  3. 传递的是引用的值,而不是引用本身,更不是对象。
  4. 可以根据传递的值访问并修改对象的内容,但是不能改变原本的引用变量的指向。

最新文章

  1. 将 Book-Crossing Dataset 书籍推荐算法中 CVS 格式测试数据集导入到MySQL数据库
  2. Gson解析的小例子
  3. JS获取上传文件的名称、格式、大小
  4. 修改Hosts后对火狐不起作用解决办法
  5. Mysql 死锁相关操作
  6. LED灯开关电路
  7. linux调度器系列
  8. Linux下查看显卡型号
  9. 京东区块排版负margin用法
  10. oracle复制表数据,复制表结构
  11. easy_install MySQL-python
  12. 关于TCP/IP协议栈(转)
  13. 学习笔记TF063:TensorFlow Debugger
  14. Docker镜像管理基础与基于容器的镜像制作示例
  15. 解决和排查 "必须使用适当的属性和方法修改 User-Agent" 错误时遇到的一些坑
  16. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
  17. Nginx使用教程(一):Nginx编译参数详解
  18. Git(五)IDEA应用Git
  19. .NET轻量级ORM组件Dapper葵花宝典
  20. spring-cloud/spring-cloud-sleuth github 项目 mark

热门文章

  1. Java秘诀!零基础怎样快速学习Java?
  2. L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧
  3. c++中的数学函数
  4. FastAPI 学习之路(十九)处理错误
  5. 关于keras框架的介绍以及操作使用
  6. Java:阻塞队列
  7. GEOS使用记录
  8. STM32串口USART的使用方法和程序
  9. TCP/IP简述
  10. ahb时序解析