首页 > 技术文章 > java函数的参数按值传递

ant-xu 2019-07-22 16:07 原文

java函数的参数是按值传递的,就是通过复制的方式传递。(js也是这样)

三个例子来说明:

基本数据类型的传递。

public class Test1{
    public static int add(int x){
        x += 10;
        return x;
    }
    public static void main(String[] args) {
        int y = 1;
        int result = add(y);
        System.out.println(y);            //1
        System.out.println(result);        //11
    }
}

函数内的改变不引响函数外的改变。所以按值传递。

对于引用类型的变量,这里使用两个例子作为比较说明。

public class Test1{
    public static void add(TestClass x){
        x.sign += 10;
    }
    public static void main(String[] args) {
        TestClass y = new TestClass();
        add(y);
        System.out.println(y.sign);        //11
    }
}

class TestClass{
    int sign = 1;
}

类TestClass的对象在传入add函数后其成员变量值被改变,因为函数中的x的值与y相同,即引用同一个对象。

public class Test1{
    public static void add(TestClass x){
        x.sign += 10;
        x = new TestClass();  //增加的部分
        x.sign = 5;        //增加的部分
    }
    public static void main(String[] args) {
        TestClass y = new TestClass();
        add(y);
        System.out.println(y.sign);        //11
    }
}

class TestClass{
    int sign = 1;
}

在main方法中的输出仍然为11,因为y将其值复制给了x,x拥有了与y相同的引用,但x与y是不同的变量,x只是一个局部变量,在函数结束后就会被销毁。x中的值的改变不会影响到y。但是x与y引用相同时,可以操作同一个引用的对象,使得y的值成员变量值发生改变。

推荐阅读