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

Java函数中的参数传递及其中的细节

发布时间:2023-06-23 04:31:26

在Java中,参数传递有两种方式:传值和传引用。对于基本数据类型的参数,采用传值方式;对于对象类型的参数,采用传引用方式。

传值方式就是将实参的值拷贝一份传递给形参,实参和形参的操作是互相独立的,对于形参的修改不会影响到实参,反之亦然。

传引用方式则是将实参的引用传递给形参,形参和实参指向同一块内存空间,对于形参的修改会影响到实参,反之亦然。

例如:

public static void change(int a, int[] b) {
    a = 10;
    b[0] = 10;
}

public static void main(String[] args) {
    int a = 1;
    int[] b = {1, 2, 3};
    change(a, b);
    System.out.println(a);//输出1
    System.out.println(Arrays.toString(b));//输出[10, 2, 3]
}

上面的例子中,change方法分别对传入的a和b[0]进行了修改,由于a是基本数据类型,所以对其修改不会影响到main方法中的a,而b是数组类型,传递的是其引用,所以对其进行的修改会影响到main方法中的b。

需要注意的是,在方法中对于对象类型的形参进行修改不会改变对象的引用,例如:

public static void change(Student s) {
    s.setName("Tom");
}

public static void main(String[] args) {
    Student s1 = new Student("张三", 18);
    change(s1);
    System.out.println(s1.getName());//输出Tom
}

上面的例子中,change方法对s的name属性进行了修改,原对象s1的引用并没有改变。

还需要注意的是,对于形参的修改不会影响其原对象的hashcode值,例如:

public static void change(Student s) {
    s.setAge(20);
}

public static void main(String[] args) {
    Student s1 = new Student("张三", 18);
    System.out.println(s1.hashCode());//输出xxxx
    change(s1);
    System.out.println(s1.hashCode());//输出xxxx
}

上面的例子中,对于s的age属性进行了修改,但s1的hashcode值并没有改变。

此外,Java还有一种可变参数的语法,可以让函数接受任意数量的同类型参数,例如:

public static int sum(int... nums) {
    int sum = 0;
    for (int i : nums) {
        sum += i;
    }
    return sum;
}

public static void main(String[] args) {
    System.out.println(sum(1, 2, 3, 4, 5));//输出15
}

上面的例子中,sum方法接受了任意数量的整数类型参数,并计算它们的和。可变参数的语法是在类型后面加上三个点(...),实际上可变参数是一个数组,可以像普通数组一样使用。

总的来说,Java中的参数传递方式有两种:传值和传引用。对于基本数据类型的参数,采用传值方式;对于对象类型的参数,采用传引用方式。在函数中对于形参的修改不会改变其原对象的引用和hashcode值,而可变参数语法可以让函数接受任意数量的同类型参数。