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

Java函数的形参与实参传递原理

发布时间:2023-06-19 14:39:54

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函数中,形参与实参的传递方式是按值传递。基本数据类型的值直接传递到函数中,实际上是值的复制。当我们在函数中对这些值进行修改时,它们不会影响到函数外的变量值。对象类型的值也是传递其引用,实际上传递的是对象的地址。当我们修改函数中的对象时,原始对象也会受到影响。

当函数需要修改基本数据类型的值时,我们需要使用返回值的方式来将修改后的值传递到函数外。当函数需要修改对象类型的值时,我们无需使用返回值,因为我们传递的是对象引用。