Java的参数传递到底是引用传递还是值传递

原创 2016年08月30日 17:14:55

首先看一段代码:

public static void main(String[] args) {
    Person a = new Person(23, "a");
    Person b = new Person(22,"b");
    System.out.println("改变前a:"+a+"\nb:"+b);
    changeValue(a,b);
    System.out.println("改变后a:"+a+"\nb:"+b);
}

private static void changeValue(Person a, Person b) {
    a.setAge(10);
    b.setAge(11);
}

输出:
改变前a:Person [age=23, name=a] b:Person [age=22, name=b]
改变后a:Person [age=10, name=a] b:Person [age=11, name=b]

然后我们要明确一下值传递和引用传递的概念:

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
参考博客园

我们都知道,Java的方法传递的是对象引用,形参和实参指向同一个对象的内存地址,所以形参修改对象的状态时,实参指向的对象状态也会发生变化。

上面的实例很容易让人认为Java是引用传递,因为形参对象的状态改变直接反应在实参对象上了!

再看一段代码:

public static void main(String[] args) {
    Person a = new Person(23, "a");
    Person b = new Person(22,"b");
    System.out.println("交换前a:"+a+"\nb:"+b);
    swap(a, b);
    System.out.println("交换后a:"+a+"\nb:"+b);
}
private static void swap(Person a, Person b) {
    Person temp = a;
    a = b;
    b = temp;
}

输出:
交换前a:Person [age=23, name=a] b:Person [age=22, name=b]
交换后a:Person [age=23, name=a] b:Person [age=22, name=b]

很奇怪吧! 为什么a和b的值没有交换呢? 按照Java是引用传递的假设,a和b的指向的对象会发生交换啊!

很多程序设计语言(特别是C++和Pascal)提供了两种参数传递的方式:值传递和引用传递。有些程序猿(甚至本书的作者)认为Java对对象采用的是引用传递,实际上,这种理解是不对的。–《Core Java Volume I》第9版P122

实际上,结合上面一个实例和值传递引用传递的概念,我们可以发现,Java方法的传值,实际上是把实参的值—-对象引用(对象的内存地址)传递给了形参,从而形参和实参的值(即变量里存储的内存地址,非变量本身的内存地址)是相同的,指向了同一个对象/内存地址


所以我们得到如下结论:Java的参数传值方式是值传递,而非引用传递。

版权声明:原创博客,标明出处,随意转载。

Java:按值传递还是按引用传递详细解说

前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有...

String参数是传值还是传递引用的测试

经常会听同行说,String是值传递还是引用传递,下面用一个例子测试一下。

JAVA中的值传递和引用传递,String的值传递特性

String的两种实例化方式的区别 String是在java编程中用的最多的数据类型,因此也有很多与其他数据类型不同的性质。 创建字符串可以用的命令有: String str="ab...

JAVA 方法的参数是按值传递还是引用传递?

JAVA 方法的参数是按值传递还是引用传递?

几句话弄清楚Java参数传值还是传引用

最近刷题用递归解决关于树的问题的时候,在递归函数调用的时候什么时候传入值,什么时候传入引用有疑问,因为这关系到什么时候我们需要恢复现场,什么时候不需要。在网上搜索了一下,感觉这篇总结的非常简单明了,简...
  • yangliuy
  • yangliuy
  • 2015年01月28日 14:58
  • 16588

Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)

原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 在Java中,所有的对象变量都是引用,Java...
  • jubincn
  • jubincn
  • 2012年02月03日 22:56
  • 3968

java 传递参数的两种方式

Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能   值传递:方法调用时,实...
  • maoyeqiu
  • maoyeqiu
  • 2015年10月19日 15:39
  • 13914

Java到底是值传递?还是引用传递?

前言 最近和同事讨论算法效率问题无意中涉及到一个问题,java中调用方法的时候是值传递呢?还是引用传递?网上搜索一下相关问题,众说纷纭,有人说值传递,有人说引用传递,还有人说”基础类型是值传递,对象...

关于基本类型的简单赋值和复合赋值运算

通过阅读下面转载的文章,Kaiwii学习到以下的内容: 1、需要判断一个变量的类型,可以采用下面的方式完成: 假如我要弄清楚2.0/SAMPLING_COUNT的结果的类型,Kaiwii可以这样做...
  • Kaiwii
  • Kaiwii
  • 2012年03月23日 16:44
  • 1041

Go缓存库cache2go源码阅读

项目地址:https://github.com/muesli/cache2go/blob/master/README.md项目介绍cache2go: 一个并发安全,具有心跳功能的缓存库。核心功能只有...
  • Paddy90
  • Paddy90
  • 2017年06月06日 16:20
  • 768
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的参数传递到底是引用传递还是值传递
举报原因:
原因补充:

(最多只允许输入30个字)