龙空技术网

小知识!值传递与引用传递

华老大的小弟 132

前言:

当前各位老铁们对“形参值的改变不会改变实参”可能比较讲究,兄弟们都需要分析一些“形参值的改变不会改变实参”的相关知识。那么小编也在网摘上汇集了一些有关“形参值的改变不会改变实参””的相关资讯,希望各位老铁们能喜欢,你们快快来学习一下吧!

0.0

按值传递的是指在方法调用时,传递的参数是实参数值的副本.按引用传递指的是在方法调用时,传递的参数是实参的引用,也可以理解为实参所对应的内存空间的地址.

为了理解java语言中的值传递与引用传递,首先给出下面的示例代码:

示例图

程序运行结果为:

Hello World

1

从运行结果可以看出,int作为参数时,对形参值的修改不会影响到实参,对于StringBuffer类型的参数,对形参对象内容的修改影响到实参.为了便于理解,int类型的参数可以理解为按值传递,StringBuffer类型的参数可以理解为引用传递.

为了方便理解,java课本中会经常提到在java应用程序中永远不会传递对象,而只传递对象引用,因此,是按引用传递对象.从本质上来讲,引用传递还是通过值传递来实现的,java语言中引用传递实际上还是值传递(传递的是地址的值).如图 1-1 所示.

图1-1 引用传递

首先按照传统的分析方法来理解按值传递和按引用传递:

为了方便理解,假设1和"Hello"存储的地址分别为0xFFFFFF12 和 0x12345678.在调用方法testPassParameter

时,由于i为基本类型,因此,参数是按值传递的,此时会创建一个i的副本,该副本与i有相同的值,把这个副本作为参数赋值给n,作为传递的参数.而StringBuffer由于是一个类,因此按引用传递,传递的是它的引用(可以理解为传递的存储"Hello"的地址),如图1-1所示,在testPassParameter内部修改的是n的值,这个值与i是没关系的.但是在修改ss1时,修改的是ss1这个地址指向的字符串的内容,由于形参ss1与实参s1指向的是同一块存储空间,因此,修改的是ss1后,s1指向的字符串也被修改了.

再从另外一个角度出发来对引用传递进行详细分析::

对于变量s1而言,它是一个字符串对象的引用,引用的字符串的值是"Hello",而变量s1的值为0x12345678(可以理解为是"Hello"的地址,或者"Hello"的引用),那么在方法调用时,参数传递的其实就是s1值的副本(0x12345678),如图1-1所示,ss1的值也为0x12345678.如果再方法调用的过程中用过通过ss1(字符串的引用或者地址)来修改字符串的内容,因为s1与ss1指向同一个字符串,所以,通过ss1对字符串的修改对s1也是可见的,但是方法中对ss1值的修改对s1是没有影响的,如下例所示:

运行结果 Hello

对运行结果分析可知,在testPassParameter方法中,依然假设"Hello"地址为0xFFFFFF12(实际上是s1的值),在方法调用的时候,首先把s1的副本传递给ss1,此时ss1的值也为0xFFFFFF12,通过调用ss1=new StringBuffer("World")语句实际上是改变了ss1的值(ssi指向了另外一个字符串"World"),但是对形参ss1值的改变对实参s1没有影响,虽然ss1被改变"World"的引用(或者"World"的地址),s1还是代表字符串"Hello"的引用(或者可以理解为s1的值仍然是"Hello"的地址).从这个角度出发来看,StringBuffer从本质上来讲还是值传递,它是通过值传递的方法来传递引用的

0.0

标签: #形参值的改变不会改变实参