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中的按值传递和按引用传递

先使用int实验: public class TTEST { private static List mList = new LinkedList(); public static voi...
  • howlaa
  • howlaa
  • 2014-07-15 16:49
  • 1625

深入理解Java方法调用的参数传递

分析了Java的基本数据类型和引用数据类型在作为方法参数被传递时,在内存中的堆(Heap)和栈(Stack)的变化过程,通过这个变化过程来理解Java方法调用的参数传递的实质。对于基本数据类型和引用数...

mysql经典数据库面试题

http://www.cr173.com/html/29311_1.html 50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Co...

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

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

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

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

【MySQL】20个经典面试题,全部答对月薪10k+

原文链接:http://bbs.51cto.com/thread-1470880-1.html Part2:经典题目 1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联;...

收集的MySQL的面试题分享给大家

1、如何登陆mysql数据库mysql -u username -p2、如何开启/关闭mysql服务service mysql start/stop3、查看mysql的状态service mysql ...

JavaScript 函数参数传递到底是值传递还是引用传递

转载地址:http://bestchenwu.iteye.com/blog/1076557  在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是...

JAVA传参数到底是值传递还是引用

1、把一个String传进一个函数去修改。却发现在函数外并没有修改成功。String s = "abcd";t2(s);System.out.println(s);在t2中改变参数的值public s...

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

值传递与引用传递:        Java到底是引用传递还是值传递,之前我看过一些介绍,但是好记性不如烂笔头,时间长了最近看到居然又忘了,所以现在记下来,方便以后查看。       ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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