java 值传递 数组传递
在java中,不允许程序员选择值传递还是地址传递各个参数,基本类型总是按值传递。对于对象来说,是将对象的引用也就是副本传递给了方法,在方法中只有对对象进行修改才能影响该对象的值,操作对象的引用时是无法影响对象。
现在说说数组:如果将单个基本类型数组的元素传递给方法,并在方法中对 其进行修改,则在被调用方法结束执行时,该元素中存储的并不是修改后的值,因为这种元素是按值传递,如果传递的是数组的引用,则对数组元素的后续修改可以 在原始数组中反映出来(因为数组本身就是个对象,int[] a = new int[2];,这里面的int是数组元素的类型,而数组元素的修改是操作对象)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Test{ String str = new String( "good" ); char [] ch = { 'a' , 'b' , 'c' }; int i = 10 ; public void change(String str, char [] ch, int i){ str = "test ok" ; ch[ 0 ] = 'g' ; i++; } public static void main(String[] args){ Test tt = new Test(); tt.change(tt.str,tt.ch,tt.i); System.out.println(tt.i); System.out.print(tt.str+ " and " ); System.out.println(tt.ch); } |
tr是String类型的引用,i是基本类型变量,ch是数组名,也是数组对象的引用
在chang()方法里,str="test ok",是一个新的对象把首地址放在引用变量str上;
而ch[0]='g';因为传的是数组的引用,而此时ch[0]='g';是对数组元素的操作,能修改源数组的内容;
i是整型值,只是把值copy了一份给方法,在方法的变化是不改变的源i的。
所以结果是:
10
good and gbc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class Test{ String str = new String( "good" ); char [] ch = { 'a' , 'b' , 'c' }; int i = 10 ; public void change(String str, char ch, int i){ str = "test ok" ; ch = 'g' ; this .i = i+ 1 ; } public static void main(String[] args){ Test tt = new Test(); tt.change(tt.str,tt.ch[ 0 ],tt.i); System.out.println(tt.i); System.out.print(tt.str+ " and " ); System.out.println(tt.ch); } } |
仔细观察下实参以及入参有何变化?
change()方法里的入参char[] ch变成--------------char ch;
这次传递的是个char值的单个数组元素,按照上面的解析,此时ch='9';是不影响源数组元素的。
this.i = i+1;这里面等号左边的i是属性i,等号右边的i是局部变量(入参里的i);
此时i+1后赋值给属性的i,自然会改变属性i的值,同时17行,tt.i又是调用属性的i,这次的结果是:
11
good and abc
http://blog.csdn.net/niuniu20008/article/details/2953785
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步