Java函数的形参与实参传递原理
Java是一种面向对象编程语言,其函数也是面向对象的。在Java函数中,会涉及到形参和实参的传递。形参是在函数定义时指定的参数,而实参是在函数调用时传递给函数的值。在本文中,我们将深入探讨Java函数的形参与实参传递原理。
Java函数的基本定义
Java函数的基本定义形式如下:
<访问修饰符> <返回类型> <函数名>(<参数类型> <参数名>, ...)
{
//函数体
}
其中:
- 访问修饰符:指定函数的访问权限,可以是public、protected、private或默认。
- 返回类型:指定函数的返回值类型,可以是任何基本数据类型或对象类型,也可以是void(表示函数无返回值)。
- 函数名:指定函数的名称。
- 参数类型:指定函数的参数类型,可以是任何基本数据类型或对象类型。
- 参数名:指定函数的参数名称,用于在函数体中引用参数值。
- 函数体:指定函数执行的操作。
Java函数的形参传递
Java函数中可以有多个形参,这些形参与函数体中的操作相结合,执行特定的功能。在函数调用时,我们需要向函数中传递实参,形参与实参一一对应,来实现函数的功能。在Java中,函数的形参是按值传递的。
按值传递的含义是,将实参的值传递给形参,形参在函数中使用这些值来执行特定的操作。实际上,在Java中,基本数据类型的值按值传递,而对象类型的值也是按值传递,但是传递的是对象的引用。
基本数据类型的例子
对于基本数据类型,我们可以通过以下例子来看看Java函数的形参传递:
public class ParameterPassing {
public static void main(String[] args) {
int a = 3, b = 4;
swap(a, b);
System.out.println("a = " + a + ", b = " + b);
}
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
}
在这个例子中,我们定义了一个main函数,并在函数中声明了两个变量a和b,然后调用swap函数来对这两个变量进行交换。
在swap函数中,我们定义了两个参数x和y,这些参数是int类型的,并且操作方式与交换两个变量的值相同。最后,我们在主函数中输出a和b的值,以检查结果。
但是,output结果显示输出为:a = 3,b = 4,这说明调用swap函数没有改变变量a和b的值。
这是因为Java的基本数据类型是按值传递的,即在swap函数中对x和y的操作并没有影响到变量a和b的值。参数x和y是swap函数的副本,而不是指向变量a和b的指针。
因此,在Java的函数中如果要改变基本数据类型的值,我们必须使用一个返回值来将修改后的值传出来。
对象类型的例子
对于对象类型,我们可以通过以下例子来看看Java函数的形参传递:
public class ParameterPassing {
public static void main(String[] args) {
Person person = new Person("Tom", 20);
increaseAge(person);
System.out.println(person);
}
public static void increaseAge(Person p) {
p.setAge(p.getAge() + 1);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
在这个例子中,我们定义了一个叫做Person的类,并定义了名字和年龄属性,并且定义了一个increaseAge函数,用于将Person对象的年龄加1。在主函数中,我们创建了一个Person对象,并且调用了increaseAge函数来对这个对象的年龄进行改变,并且输出了Person对象的toString方法。
如果同样的按值传递原理,我们认为在increaseAge函数执行结束后,person对象仍然是{name='Tom', age=20}。
但是,结果输出为{name='Tom', age=21}。为什么呢?
这是因为我们传递的不是对象本身,而是对象的引用。Java中的对象变量只是存储对象的引用。因此,我们传递对象变量时,实际上传递的是对象引用,当函数中修改对象时,原始对象也会受到影响。
总结:
在Java函数中,形参与实参的传递方式是按值传递。基本数据类型的值直接传递到函数中,实际上是值的复制。当我们在函数中对这些值进行修改时,它们不会影响到函数外的变量值。对象类型的值也是传递其引用,实际上传递的是对象的地址。当我们修改函数中的对象时,原始对象也会受到影响。
当函数需要修改基本数据类型的值时,我们需要使用返回值的方式来将修改后的值传递到函数外。当函数需要修改对象类型的值时,我们无需使用返回值,因为我们传递的是对象引用。
