java传参

来源:互联网 发布:centos安装aptget命令 编辑:程序博客网 时间:2024/06/04 22:47

java的传参是按值传参(我现在的理解) 

1、基本数据类型作为变量(变量的复制品);

所以要改变要像c/c++那样可写一个可以交换基本类型变量值的函数在java中要费劲的多。

2、对象引用作为参数,其实传入的也只是对象的引用的复制品(不是对象的复制品),本质上还是按值传参,但是这些应用的复制品不管有多少个,总之还是指向同一个对象。除非你把它指向另外的对象或者置为null,否则你通过引用操纵对象成员一定能够改变对象的内容。假如大家不理解,可以看我下面的例子:

class Test
{
 public static void main(String args[])
 {
  int val;
  StringBuffer sb1, sb2;
  
  val = 10;
  sb1 = new StringBuffer("apples");
  sb2 = new StringBuffer("pears");
  System.out.println("val is " + val);
  System.out.println("sb1 is " + sb1);
  System.out.println("sb2 is " + sb2);
  System.out.println("***********************");
  System.out.println("calling modify");
  //按值传递所有参数
  modify(val, sb1, sb2);
  System.out.println("returned from modify");
  System.out.println("***********************");
  
  System.out.println("val is " + val);
  System.out.println("sb1 is " + sb1);
  System.out.println("sb2 is " + sb2);
 }
  
 public static void modify(int a, StringBuffer r1,StringBuffer r2)
 {
  a = 0;  //基本变量还是按值传递
  r1 = r2; //引用一样是按值传递,其作用域是有限制的,不是把r2的地址给r1,赋予的只是一个引用变量。
  r2.append(" taste good");//操纵原对象的值。
  r1=r2;
  System.out.println("方法中a is " + a);
  System.out.println("方法中r1 is " + r1);
  System.out.println("方法中r2 is " + r2);
 }
}

结果:

val is 10
sb1 is apples
sb2 is pears
***********************
calling modify
方法中a is 0
方法中r1 is pears taste good
方法中r2 is pears taste good
returned from modify
***********************
val is 10
sb1 is apples
sb2 is pears taste good

3、要注意String类型以及所有的基本类型的Wrrapper类有特殊情况,他们的引用改变不了他们所指向的对象的值。因为他们是IMMUTABLE类。只有将改变后的对象作为返回值才能得到改变后的对象。