在方法调用时,需要根据方法声明传入适当的参数,通过每次调用方法时传参,极大的增强了方法的统一性,避免了方法内部功能代码的重复。但是在实际传递参数时,如果在方法内部修改了参数的值,则调用时使用的变量是否发生改变呢?
例如如下代码: /** * 参数传递代码示例 */ public class TransferValueDemo { public static void main(String[] args) { int m = 10; int[] a = {1,2,34}; test(m,a); System.out.println(m); System.out.println(a[0]); } public static void test(int n,int[] t){ n = 0; t[0] = 123; } } 则执行该程序以后,程序的输出结果是:10 123。则在调用test方法时,同样都是传入参数,为什么变量m的值未改变,而a[0]的值发生了改变呢?下面就来说明该问题。 在参数传递时,一般存在两种参数传递的规则,在Java语言中也是这样,这两种方式依次是: l 按值传递(by value) 按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的时拷贝出来的值,而原始的值不发生改变。 说明:使用该方式传递的参数,参数原始的值不发生改变。 l 按址传递(by address) 按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。 说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。 在Java语言中,对于那些数据类型是按值传递,那些数据类型是按址传递都作出了硬性规定,如下所示: l 按值传递的数据类型:八种基本数据类型和String l 按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口 按照这里的语法规则,则上面的代码中变量m的类型是int,属于按值传递,所以在方法内部修改参数的值时m的值不发生改变,而a的类型是数组,属于按址传递,所以在方法内部修改参数的值时,原始的值发生了改变。 按值传递和按址传递在实际使用时,需要小心,特别是在方法内部需要修改参数的值时。有些时候,对于按值传递的参数需要修改参数的值,或者按址传递时,不想修改参数的值,下面是实现这两种方式时的示例代码。 按值传递时通过返回值修改参数的值: /** * 按值传递的类型通过返回值修改参数的值 */ public class TransferValueDemo1 { public static void main(String[] args) { int m = 10; m = test1(m); //手动赋值 System.out.println(m); } public static int test1(int n){ n = 15; return n; } } 在该示例代码中,通过把修改以后的参数n的值返回,来为变量m赋值,强制修改按值传递参数的值,从而达到修正参数值的目的。 按址传递时通过重新生成变量避免修改参数的值: /** * 按址传递时通过重新生成变量避免修改参数的值 */ public class TransferValueDemo2 { public static void main(String[] args) { int[] a = {1,2,3}; test2(a); System.out.println(a[0]); } public static void test2(int[] m){ int[] n = new int[m.length]; for(int i = 0;i < m.length;i++){ n[i] = m[i]; } n[0] = 10; } } 在该示例代码中,通过在方法内部创新创建一个数组,并且把传入数组中每个参数的值都赋值给新创建的数组,从而实现复制数组内容,然后再修改复制后数组中的值时,原来的参数内容就不发生改变了。 这里系统介绍了Java语言中参数传递的规则,深刻理解这些规则将可以更加灵活的进行程序设计。例如使用复合数据类型按址传递的特性可以很方便的实现多参数的返回,代码示例如下: public int test3(int[] m,int[] n){……} 则该方法中,实际上返回了三种值,一个int的返回值,数组m的值,数组n的值,这只是参数传递的一种基本使用,在JDK提供的API文档中也大量的存在该方法。 |
JAVA方法参数传递技巧[转]
最新推荐文章于 2021-11-25 09:15:15 发布
序
在写了一堆叫做“JAVA” “ 方法”的代码后,调试时,发现数据竟然和自己想的不同,只好查询了一下JAVA的参数传递方式,在经过一段时间摆渡,结果还是没太搞清楚,最后发现了这么一篇介绍,加上之前自己的查询的资料,算是比较明白了。以下这篇文章并未说得非常清楚,还是有些内容未说,比如对象为空时,有需要再另外查询吧,以下是全文:
正文
JAVA方法参数传递技巧!!