java方法传参

303 阅读2分钟

java方法传参的时候有时候会改变原来的值,有时候不会,是因为它分很多种情况的:原始类型,引用类型,不可变类型,改变值,改变地址。

1.原始类型

public static void main(String[] args) {
    //对String的判断
    String a = "A";
    String b = "B";
    testString(a,b);
    System.out.println(a+" "+b);

    //对int的判断
    int aInt = 1;
    int bInt = 2;
    testInt(aInt, bInt);
    System.out.println(aInt+" "+bInt);

  }

  private static void testString (String aa, String bb) {
    aa = "AA"; //改变值
    bb = "BB";//改变地址
  }

  private static void testInt(int aInt, int bInt) {
    aInt += 1; //改变值
    bInt = aInt; //改变地址
  }
}

运行结果:

A B
1 2

2.引用类型,改变值 运行结果:

new value

3.引用类型,改变地址 运行结果:

initial value

  Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。   如果参数类型是原始类型(boolean,char,byte,short,int,long,float,double),那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.   如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。一旦修改了地址,就和原先的变量没关系了,原先的变量就访问不到修改的内容了。 其中String,Integer特殊,因为两者是不可变类,每一个修改值都是一个新的变量。