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值,而可变参数语法可以让函数接受任意数量的同类型参数。
