学习Java中的函数传参:值传递vs引用传递
Java是一种面向对象的编程语言,也是一种类型安全的语言。这就意味着你在编写Java程序时经常需要使用函数来执行基本操作和复杂任务。然而,理解Java中的函数是如何传递参数的极其重要。在Java中,函数传递参数有两种方式:值传递和引用传递。接下来,我们将介绍这两种传递方式的概念和使用。
值传递(Pass by Value)
在值传递中,函数传递的是变量值的副本,也就是函数中的形参与实参的值一致,却是两个不同的内存地址。这意味着,当实参被传递到函数中时,函数将获取一个新的内存地址,该地址仅保存实参的值。因此,如果在函数中修改这些值,原始实参的值不会受到影响。
让我们来看一个实例,这将帮助我们更好地理解值传递的概念:
public class PassByValueExample {
public static void main(String [] args) {
int x = 10;
System.out.println("Value of x before function call: " + x);
changeValue(x);
System.out.println("Value of x after function call: " + x);
}
public static void changeValue(int y) {
y = 20;
}
}
输出结果是:
Value of x before function call: 10 Value of x after function call: 10
在这个示例中,我们声明了一个主函数并初始化了一个int类型的变量x,初始值是10。我们在函数内调用了changeValue函数,它的任务是将y的值设置为20。在这里,我们期望在main函数执行后输出20,因为我们修改了y的值。但是,由于Java使用的是值传递方式,我们最终打印出来的是10,这意味着主函数的实参值未被改变。
引用传递(Pass by Reference)
在引用传递中,函数传递的是变量的引用。与值传递方式不同,在引用传递中,实参的引用(内存地址)被传递到了函数中,这意味着,如果在函数中修改了这些值,原始实参的值也会相应地修改。
让我们继续上述示例并使用引用传递来传递值:
class Person {
int age;
public void changeAge(Person p) {
p.age = 20;
}
}
public class PassByReferenceExample {
public static void main(String [] args) {
Person person = new Person();
person.age = 10;
System.out.println("Age before function call: " + person.age);
person.changeAge(person);
System.out.println("Age after function call: " + person.age);
}
}
输出结果是:
Age before function call: 10 Age after function call: 20
在这个示例中,我们定义了Person类和它的changeAge函数。在函数中,我们将p对象的值设置为20,它是这个函数的形参。在主函数中,我们创建一个新的Person对象并将整数值10分配给它的age属性。我们然后在changeAge函数中使用实例person作为参数,并对其进行修改。由于我们使用的是引用传递,该函数将始终获取对person对象的引用,这意味着在函数中所做的任何修改都将直接影响原始实参的值。因此,我们的程序会打印出20,而不是10。
结论
函数传递参数是Java语言编程中的一个基本件。这是一种非常重要的技能,应该被正确理解和使用。在Java中,函数参数传递有两种方式:值传递和引用传递。在值传递方式下,只是传递了实参的副本,也就是形参占据的内存地址和实参不同。在引用传递中,函数传递的是变量的引用,这意味着函数可以直接修改原始实参的值。了解Java中函数传递参数的这些不同之处,可以帮助java程序员更好地编写功能强大的Java应用程序。
