Java参数传递

转自: java中的值传递和引用传递

一、值传递和引用传递

  1. 值传递
    传递的是原始值的副本,即原始值的拷贝。因此如果函数内修改了该参数,则仅仅是修改了副本,而原始值保持不变。
  2. 引用传递
    函数接收的是原始值的内存地址。
  3. 结论:Java是按值传递参数,传递的都是一份拷贝,而不是数据本身。

二、代码验证

1、 基本数据类型按值传递参数代码验证:

package com.tide.controller;

/** * Created by wengliemiao on 16/3/28. */
public class Example1 {
    public static void main(String[] args) {
        Example1 e = new Example1();

        int a = 2;
        int b = 5;
        e.change(a, b);
        System.out.println("结果为: " + a + " " + b);
    }

    public void change(int a, int b) {
        int i = a;
        a = b;
        b = i;
    }
}

说明:由于传递的是 a 和 b 的拷贝,因此 change() 函数内的值交换对原始值未造成影响,因此输出还是 2 和 5.

2、引用数据类型按值传递代码验证:
引用数据类型参数说明:传递的是对象的引用的拷贝,因此修改对象的内容会对对象造成影响;而修改引用的地址,如修改指向的对象,则不会对对象造成影响,只是引用的拷贝指向了一个新的对象。

2.1、参数为引用数据类型情况一:

传递的是对象的引用的拷贝。

代码验证如下:

package com.tide;

/** * Created by wengliemiao on 16/3/28. */
public class Example2 {
    int i = 0;

    public static void main(String[] args) {
        Example2 a = new Example2();
        a.add(a);
        System.out.println(a.i);
    }

    public void add(Example2 a2) {
        a2.i ++;
    }
}

Java参数传递_第1张图片

说明:更改了对象的 i 属性,由于 a2 和 a 指向的是同一个对象,所以修改 a2 对象的属性,也即修改 a 对象的属性。

2.2 参数为引用数据类型情况二,在方法中修改了引用的指向,则对修改指向后的对象的值的更改对原始对象无影响。

Java参数传递_第2张图片

代码验证:

package com.tide;

/** * Created by wengliemiao on 16/3/28. */
public class Example2 {
    int i = 0;

    public static void main(String[] args) {
        Example2 a = new Example2();
        a.add(a);
        System.out.println(a.i);
    }

    public void add(Example2 a2) {
        a2 = new Example2(); // 增加此行代码
        a2.i ++;
    }
}

Java参数传递_第3张图片

说明:修改了 a2 引用的指向,则对 i 属性的更改不会对 a 对象造成影响。

3.参数为引用数据类型的特殊情况:String 类:

package com.tide.controller;

/** * Created by wengliemiao on 16/3/28. */
public class Example3 {
    private String str = "Hello";
    private char[] ch = {'a', 'b', 'c'};

    public void change(String s, char[] aCh) {
        s = "good";
        aCh[0] = 'g';
    }

    public static void main(String[] args) {
        Example3 a = new Example3();
        a.change(a.str, a.ch);
        System.out.println(a.str);
        System.out.println(a.ch);
    }
}

Java参数传递_第4张图片

说明:其实String也是对象类型,按值传递参数类型,但因为String对象只要一改变就会产生新的对象,所以此处相当于:

s = new String("good");

因此,修改String值的操作都相当于修改了引用的指向地址。

三、总结

Java中的按值传递参数可分为两种:
1、传递值的数据类型:八中基本数据类型和String;
2、传递地址值的数据类型:除String以外的复合数据类型,包括数组,类和接口。

最后记录一个例子:

package com.tide;

/** * Created by wengliemiao on 16/3/28. */
public class Example4 {

    private int a = 10;
    private StringBuffer sb1 = new StringBuffer("This is sb1 ");
    private StringBuffer sb2 = new StringBuffer("This is sb2 ");

    public void modify(int a, StringBuffer sb1, StringBuffer sb2) {
        a = 0;
        sb1 = new StringBuffer("This is sb3");
        sb2.append(", add append.");
    }

    public static void main(String[] args) {
        Example4 a = new Example4();


        System.out.println("before modify: ");
        System.out.println(a.a);
        System.out.println(a.sb1);
        System.out.println(a.sb2);

        a.modify(a.a, a.sb1, a.sb2);

        System.out.println();
        System.out.println("after modify: ");
        System.out.println(a.a);
        System.out.println(a.sb1);
        System.out.println(a.sb2);
    }

}

输出为:

你可能感兴趣的:(java,参数传递)