Java数组引用方法的时候,比如 trans(a[0],a[1]); 传递的是值还是地址?(代码 如下,结果不一样)

  1. static void trans(int a,int b)
  2. {a/=2;
  3. b+=3; }
  4. static void transt( int []a) { a[0]/=2; a[1]+=3;}
  5. static void show(int a,int b)
  6. {
  7. System.out.println("交换之后为:a="+a+",b="+b);
  8. }
  9. int d[]=new int[2];
  10. d[0]=10;
  11. d[1]=20;
  12. trans(d[0],d[1]);
  13. show(d[0],d[1]);
  14. int k[]=new int[2];
  15. k[0]=10;
  16. k[1]=20;
  17. transt(k);
  18. show(k[0],k[1]);

  19. 交换之后为:a=10,b=20

  20. 交换之后为:a=5,b=23

数组传地址,变量传值

trans(d[0],d[1]);传递的是值(值传递),transt(k);传递的是地址(引用传递)。

这个设计到java的内存模型,以及值传递方式,另外,楼上回答的有误,java里面没有引用传递,只有值传递,虽然你的形参是数组或者引用类型
但是传递还是值传递。
参数是int类型的时候,java会将实参的值的大小赋值给形参,之后,你在方法体里面的操作,都是对这个形参进行的操作,实参并没有受到影响。
你第一个方法,java执行时做的操作就是,在栈中创建了俩个形参变量,a和b,然后a=10,b=20,之后,你在方法体里的操作都是对创建的俩个
形参a,b的操作,并没有操作数组d[]的d[0]和d[1]这俩个内存的值。
参数是数组类型时,java会把数组在内存中的首地址赋值给形参a[]数组,然后这个形参a[]的内存里面存的就是实参k[]的首地址,之后,你在方法体里面
操作a[0]时,真正操作的就是实参k[0]的内存,所以你最后打印的结果会变。
另外说一句,如果你第二个方法,传入数组的时候,在方法体里面,把数组进行了重新赋值的操作,其实不会影响实参,如下操作:
static trans(int[] a){ a ={1,2} ;}
如果想详细了解这块,可以去这里看,https://blog.csdn.net/m0_37872413/article/details/88830124