java中参数的两种传递方式

288 阅读3分钟

Java中有两种传递参数的方式,分别为:

  值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。

  引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

  • a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址)。

  • b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口 下面为值传递的例子:

public class Test{
    public static void change(int i,int j){
        int temp = i;
        i = j;
        j = temp;
    }
    public static void main(String[] args){
        int a = 3;
        int b = 4;
        chage(a, b);
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

输出的结果是 a=3 b=4,传递的值并不会改变原值; 引用传递的例子:

public class Test{
    public static void change(int[] counts){
        counts[0] = 1;
        System.out.println(counts[0]);
    }
    public static void main(String[] args){
        int[] count = { 7, 8, 9, 4, 5};
        change(count);
        System.out.println(count[0]);
    }
}

输出结果是1 , 这意味着引用的值改变了原来的值
总结:对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。   Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。   如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.   如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。