2019独角兽企业重金招聘Python工程师标准>>>

在Java中并不存在引用传递(即地址传递),对于变量(可以是基本数据类型,也可以是引用数据类型)而言,可以理解为就是一个地址。传递,存在着拷贝操作。举个列子:

1、在方法参数上,传递的是基本数据类型。
定义了一个用于交换两个整型数的方法:

public static void swap(int a, int b) {int temp = a;a = b;b = temp;System.out.println("In swap: a = " + a + ", b = " + b);}

在main方法里初始化两个整型变量,并调用swap方法:

public static void main(String[] args) {int a = 1;int b = 2;System.out.println("Before swap: a = " + a + ", b = " + b);swap(a, b);System.out.println("After swap: a = " + a + ", b = " + b);}

注:假设实参a为0x0001,实参b为0x0002。它们所指向的值分别为1和2。

输出结果为:

Before swap: a = 1, b = 2
In swap: a = 2, b = 1

After swap: a = 1, b = 2

注:调用swap方法时,由于是值传递,所以可以假设形参a为0x0003,形参b为0x0004。这时实参a和b将自己所指向的值拷贝了一份。根据调用的方法参数列表与声明的方法参数列表一一对应的顺序,这时0x0003所指向的值是1,0x0004所指向的值是2。对应值传递这个概念,这时拷贝的是值1和2。

对于swap方法的作用是指将0x0003和0x0004所指向的值进行了交换。即0x0003所指向的值变成了2,而0x0004所指向的值变成了1。所以对于实参a和b来说并不受影响。 

如果真的存在引用传递的话,这时候形参的值是地址,即拷贝的是0x0001和0x0002。

交换作用就会反映到实参a和b上。

2、在方法参数上,传递的是引用数据类型。

这里以Person类为例:

class Person {private String name;public Person(String name) {this.name = name;}@Overridepublic String toString() {return "My name is " + this.name + ".";}
}

同样,定义一个swap方法,用于交换两个引用数据类型:

public static void swap(Person c, Person d) {Person temp = null;temp = c;c = d;d = temp;System.out.println("In swap: " + c + ", " + d);}

在main方法里初始化两个Person类型的引用,并调用swap方法:

public static void main(String[] args) {Person c = new Person("c");Person d = new Person("d");System.out.println("对于引用数据类型");System.out.println("Before swap: " + c + ", " + d);swap(c, d);System.out.println("After swap: " + c + ", " + d);}

注:假设实参c为0x0001,实参d为0x0002。它们有各自引用的对象0x000c和0x000d。它们是对象在堆区里的存放地址。

输出结果为:

对于引用数据类型
Before swap: My name is c., My name is d.
In swap: My name is d., My name is c.
After swap: My name is c., My name is d.

注:调用swap方法时,由于是值传递,所以可以假设形参c为0x0003,形参d为0x0004。根据调用的方法参数列表与声明的方法参数列表一一对应的顺序,这时形参c(0x0003)所引用的就是实参c(0x0001)所引用的对象, 形参d(0x0004)所引用的就是实参d(0x0002)所引用的对象 。 对应值传递这个概念,这时拷贝的是0x000c和0x000d。 

此时swap方法的作用是指将0x0003和0x0004对对象的引用进行了交换。

如果真的存在引用传递的话,这时候拷贝的是0x0001和0x0002。

交换作用就会反映到实参c和d上。

注:变量是存放在栈区的,而对象是存放在堆区的。

引用数据类型值传递的图解:
1、swap调用前:

2、调用swap的时候:

3、swap方法执行完后:

4、swap调用后:

完整的实例程序代码如下:

package com.test;public class Test {public static void swap(int a, int b) {int temp = a;a = b;b = temp;System.out.println("In swap: a = " + a + ", b = " + b);}public static void swap(Person c, Person d) {Person temp = null;temp = c;c = d;d = temp;System.out.println("In swap: " + c + ", " + d);}public static void main(String[] args) {int a = 1;int b = 2;Person c = new Person("c");Person d = new Person("d");System.out.println("对于基本数据类型");System.out.println("Before swap: a = " + a + ", b = " + b);swap(a, b);System.out.println("After swap: a = " + a + ", b = " + b);System.out.println("对于引用数据类型");System.out.println("Before swap: " + c + ", " + d);swap(c, d);System.out.println("After swap: " + c + ", " + d);}
}class Person {private String name;public Person(String name) {this.name = name;}@Overridepublic String toString() {return "My name is " + this.name + ".";}
}

总结:
1、Java中只存在值传递,并不存在引用传递。
2、若形参引用修改了所引用的对象的状态,则也会反映到实参引用上。

转载于:https://my.oschina.net/belinwu/blog/70682

Java中只存在值传递相关推荐

  1. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  2. [转载] 由swap引出的java中参数严格值传递问题

    参考链接: Java严格按照值传递 [size=large]博文出处:http://atleeon.com/code/2013/11/28/java-swap-value/ [/size] 晚上看到一 ...

  3. java中什么是值传递

    一.什么是值传递 1.示例 2.堆栈解析图 为什么别的对象并不能改变原对象的指向呢? 二.怎么才能像我们所想的那样直接改变他的值呢? 一.什么是值传递 1.示例 我们首先用一个例子引出这个问题(后面会 ...

  4. java开根号函数_Java中真的只有值传递么?

    原创: ITwalking 转载于公众号[ 编程大道] (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法 ...

  5. 【重难点】【Java基础 04】值传递和引用传递、序列化和反序列化

    [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 文章目录 [重难点][Java基础 04]值传递和引用传递.序列化和反序列化 一.值传递和引用传递 1.对比 二.序列化 1.基本概 ...

  6. Java基础4:值传递

    一.前言   本文内容摘自<深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)>一书,2022年出版,作者 张洪亮(@Hollis),阿里巴巴技术专家,著有<Java工 ...

  7. Java中方法参数的传递

    Java中方法参数的传递: 众所周知,Java语言中只有值传递,看起来很好理解的一句话,那么来看一个例子: 输出结果: 这是一个经典问题,我想说说自己的理解: 首先,变量sa和sb分别包含一个字符串对 ...

  8. java 数组 取部分_在Java中只获取一部分数组?

    在Java中只获取一部分数组? 我在Java中有一个Integers数组,我只想使用它的一部分. 我知道在Python中你可以做类似这个数组[index:]的东西,它从索引中返回数组. 这样的事情在J ...

  9. java中的返回值到底有什么用?

    今天看到一个有意思的问题:java中的返回值到底有什么用? 看到了一个高赞回答如下: 你是公司的老总,然后你跟你秘书说,我想要两张的电影票.然后,你秘书去排队买票,最后把两张电影票给你,这两张电影票就 ...

最新文章

  1. 【OpenCV 4开发详解】图像仿射变换
  2. 利用FFT计算非平稳随机信号WVD分布
  3. 饿了么CTO张雪峰:允许90后的技术人员“浮躁“一点
  4. 详解get与post请求方式、content-type与responseType、@Requestbody与@Requestparam的使用场景
  5. 面向过程 VS 面向对象
  6. 学校学生工科学生接私活_为什么我要在学校教年轻的学生如何编码
  7. 基于一款 wk2168芯片的串口扩展
  8. 尽量不要在viewWillDisappear:方法中移除通知
  9. 如何重启虚拟机里的ssh服务器,通过SSH重启 vSphere 虚拟机
  10. 〖Demo〗-- 多级评论
  11. motion的移植和使用
  12. matlab浪漫画图,Matlab技巧11:谁说数学人不懂浪漫——Matlab画隐函数曲面
  13. 【物联网毕设基础】实时时钟芯片 DS1302 介绍
  14. 【软硬件基础】X86和X64
  15. 使用Google镜像构建工具Jib报错:No plugin found for prefix 'jib' ...
  16. 完美解决丨1. **`SyntaxError: invalid syntax`**
  17. webservice学习
  18. rails strip
  19. 富文本框让最大四百像素_8 大功能,适合摄影师、设计师的开源工具集
  20. Python实现停车场管理系统

热门文章

  1. Cocoa Autolayout:内容拥抱与内容压缩阻力优先
  2. 如何查看Git提交中的更改?
  3. Android:如何使用资源名称从资源中获取字符串?
  4. layui 读取本地excel内容_layui之数据表格--与后台交互获取数据的方法
  5. win7旗舰版系统如何重装系统win10
  6. Makefile:GCC CFLAGS变量和LDFLAGS变量
  7. SpringBoot连接远程云服务器的Redis并且让Redis后台运行
  8. Open3d之自定义可视化
  9. OpenCV 画圆circle、画椭圆ellipse
  10. linux内存回收 内核参数