Java函数的参数传递方式及传参技巧
Java函数的参数传递方式及传参技巧
Java函数的参数传递方式有值传递和引用传递两种方式。
1. 值传递:将实际参数的值复制一份给形式参数,函数使用的是形式参数的值而不是实际参数的值。在函数内部改变形式参数的值不会影响实际参数。
2. 引用传递:将实际参数的引用地址赋值给形式参数,函数使用的是实际参数的引用地址,所以在函数内部改变形式参数的值会影响实际参数。
下面我们来分别看一下这两种传递方式的具体细节以及一些传参技巧。
1. 值传递
值传递是Java中常见的参数传递方式,它将实际参数的值复制一份给形式参数,函数改变形式参数的值不会影响实际参数。
在Java中,基本数据类型(比如int、double等)属于值传递的方式。例如:
public static void main(String[] args) {
int a = 10;
changeValue(a);
System.out.println("a = " + a); // 输出结果为:a = 10
}
public static void changeValue(int value) {
value = 20;
System.out.println("value = " + value); // 输出结果为:value = 20
}
从上面的例子中可以看出,尽管在changeValue函数中改变了形式参数的值,但是在main函数中对应的实际参数的值并没有改变。
对于引用类型的参数,虽然存储的是引用地址,但是实际传递的是引用地址的副本。例如:
public static void main(String[] args) {
int[] arr = {1, 2, 3};
changeArray(arr);
System.out.println("arr[0] = " + arr[0]); // 输出结果为:arr[0] = 10
}
public static void changeArray(int[] array) {
array[0] = 10;
System.out.println("array[0] = " + array[0]); // 输出结果为:array[0] = 10
}
从上面的例子中可以看出,虽然在changeArray函数中改变了形式参数array首元素的值,但是在main函数中对应的实际参数arr的值也改变了。
需要注意的是,虽然在引用类型的参数中,引用地址形参和实参地址都是指向同一块堆内存。但是如果在函数内部重新给形参分配了堆内存空间,则会改变引用地址,这样在函数外部无法得到新的地址。
2. 引用传递
引用传递是指将实际参数的引用地址赋值给形式参数,函数使用的是实际参数的引用地址,所以对形式参数的修改会影响实际参数的值。
在Java中,对象类型(比如数组、类等)属于引用传递的方式。例如:
public static void main(String[] args) {
Person person = new Person("Tom");
changeName(person);
System.out.println(person.getName()); // 输出结果为:Tom
}
public static void changeName(Person p) {
p.setName("Jerry");
System.out.println(p.getName()); // 输出结果为:Jerry
}
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
从上面的例子中可以看出,尽管在changeName函数中改变了形式参数p的属性值,但是在main函数中对应的实际参数person的属性值也改变了。
除了上面提到的两种传递方式外,还有一种特殊情况需要注意,即String类型。虽然String属于对象类型,但在Java中被看作是常量,因此传递时不论是否改变String的值,都是按值传递的方式。例如:
public static void main(String[] args) {
String str = "Hello";
changeString(str);
System.out.println(str); // 输出结果为:Hello
}
public static void changeString(String s) {
s = "World";
System.out.println(s); // 输出结果为:World
}
从上面的例子中可以看出,尽管在changeString函数中改变了形式参数s的值,但是在main函数中对应的实际参数str的值并没有改变。
在实际编程中,我们可以根据函数参数传递方式的不同来选择使用什么样的技巧。
1. 对于值传递的参数,函数内部对形式参数的改变不会影响实际参数,因此可以放心修改。
2. 对于引用传递的参数,函数内部对形式参数的改变会影响实际参数。这时候需要特别小心,可以通过传递参数的副本,或者使用不可变类型来避免对实际参数的修改。
总结:
Java函数的参数传递方式包括值传递和引用传递两种方式。值传递将实际参数的值复制一份给形式参数,引用传递将实际参数的引用地址赋值给形式参数。对于值传递的参数,函数内部的修改不会影响实际参数;对于引用传递的参数,函数内部的修改会影响实际参数。在实际编程中,我们可以根据传参方式的不同来选择合适的传参技巧。
