Java参数传递

来源:互联网 发布:json文件dw打开乱码 编辑:程序博客网 时间:2024/06/05 23:04

转自: 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;    }}

例1

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

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

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

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

说明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 ++;    }}

例2

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

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

说明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 ++;    }}

例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);    }}

例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);    }}

输出为:

例5

0 0