欢迎访问宙启技术站
智能推送

在Java中如何传递函数参数并且改变其值?

发布时间:2023-06-11 00:25:45

Java中函数参数传递方式分为值传递和引用传递两种形式,对于不同类型的变量,在传递时需要采用不同的方式来改变其值。

1. 值传递

值传递是将变量的值复制一份传递给函数,函数内部对该变量进行修改不会影响原来的变量值。在Java中,所有的基本数据类型(byte,short,int,long,float,double,char,boolean)都是值传递,同时,字符串类型也是值传递。

例如:

public class ValueTransferExample {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("函数调用前的num:" + num);
        changeNum(num);
        System.out.println("函数调用后的num:" + num);
    }

    public static void changeNum(int num) {
        num = num + 10;
    }
}

运行该程序会得到以下输出结果:

函数调用前的num:10
函数调用后的num:10

从输出结果中可以看出,在函数内部对num进行修改,并不会影响到原本的num的值,因为Java中基本数据类型的变量是以值的形式被传递到函数中的。

2. 引用传递

对于引用类型的变量(包括数组和对象),传递的是变量的地址,在函数中对变量的修改会对原数组或对象的数值进行修改。因此,在Java中,对于引用类型的变量,它们是被引用传递(或称为地址传递)到函数中的。

例如:

public class ReferenceTransferExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println("函数调用前的数组:");
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
        changeArr(arr);
        System.out.println("函数调用后的数组:");
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }

    public static void changeArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] * 2;
        }
    }
}

运行该程序会得到以下输出结果:

函数调用前的数组:
1 2 3 4 5 
函数调用后的数组:
2 4 6 8 10 

从输出结果中可以看出,在对数组进行修改后,原本的数组也被修改了。这是因为在函数changeArr中,使用的是arr这个引用类型的变量,它其实传递的是指向原数组的地址,所以所做的修改会直接作用在原数组上。

同样的,对于对象类型也是采用引用传递的方式来传递,下面是一个示例代码:

public class ReferenceTransferExample {
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);
        System.out.println("函数调用前的person:" + person.getName() + " " + person.getAge());
        changePerson(person);
        System.out.println("函数调用后的person:" + person.getName() + " " + person.getAge());
    }

    public static void changePerson(Person person) {
        person.setName("Jerry");
        person.setAge(30);
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

运行该程序会得到以下输出结果:

函数调用前的person:Tom 20
函数调用后的person:Jerry 30

从输出结果中可以看出,在对person进行修改后,原先的person被修改了。这是因为在函数changePerson中,使用的是person这个引用类型的变量,它传递的是指向原先的person对象的地址,所以对它所做的修改会直接作用在原来的对象上。

需要注意的是,如果在函数内部使用的是一个新的对象(即二级指针),则在函数外部的对象是不会受到影响的,例如:

public class ReferenceTransferExample {
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);
        System.out.println("函数调用前的person:" + person.getName() + " " + person.getAge());
        changePerson(person);
        System.out.println("函数调用后的person:" + person.getName() + " " + person.getAge());
    }

    public static void changePerson(Person person) {
        person = new Person("Jerry", 30);
    }
}

运行该程序会得到以下输出结果:

函数调用前的person:Tom 20
函数调用后的person:Tom 20

从输出结果中可以看出,因为在函数内部直接使用了一个新的对象,所以被引用的对象并没有被修改。

总结:

对于基本数据类型,采用值传递的方式来传递参数,在函数内部修改不会影响到原来的变量值。对于引用类型的变量,采用引用传递来传递参数,对变量进行的修改会直接作用于原来的对象上。需要注意的是,如果在函数内部直接使用了一个新的对象,那么被引用的对象并不会被修改。