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

Java函数的传参方式——值传递和引用传递详解

发布时间:2023-11-24 16:10:51

在Java中,函数的参数传递方式是通过值传递(pass by value)。这意味着当函数调用时,参数的值会被传递给函数,而不是参数本身。

值传递的基本原理是,将实参的副本传递给函数,在函数内部对副本的修改不会影响到实参本身。这是因为每一个变量都有自己的内存地址,函数参数相当于创建了一个新的局部变量,相对于实参来说,它们只是具有相同的值而已。

例如,考虑以下示例代码:

public class Main {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println(num);
    }
    
    public static void changeValue(int value) {
        value = 20;
    }
}

在这个例子中,我们定义了一个名为changeValue的函数,接受一个整数参数value。在调用changeValue函数之前,我们初始化了一个变量num并赋值为10。然后,我们调用changeValue函数,并将num作为参数传递给函数。

changeValue函数内部,我们将参数value的值设置为20。然而,当我们在main函数中打印num的值时,结果仍然是10。这是因为函数调用时,对参数的修改只影响到了参数的副本,不会改变原始的实参。

除了值传递,Java中还支持引用传递(pass by reference)。在引用传递中,函数将实参的引用(内存地址)作为参数传递给函数,这意味着函数可以直接访问和修改实参本身。

然而,在Java中并没有显式的引用传递机制。虽然对象变量在Java中存储的是对对象内存地址的引用,并且对象参数使用对象的引用进行传递,但实际上,对象引用也是通过值传递来传递的。当对象引用作为参数传递给函数时,实际上是将对象的引用(内存地址)的副本传递给了函数。因此,在函数内部对引用的修改不会影响到原始的引用。

下面是一个示例代码,展示了在Java中对象的传递方式:

class Person {
    String name;
    
    public Person(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John");
        changeName(person);
        System.out.println(person.name);
    }
    
    public static void changeName(Person p) {
        p.name = "Smith";
    }
}

在这个例子中,我们定义了一个Person类,类中有一个name属性。在main函数中,我们创建了一个Person对象并将其赋值给person变量。然后,我们调用changeName函数,并将person作为参数传递给函数。

changeName函数内部,我们将参数pname属性设置为"Smith"。最后,在main函数中打印person.name的值,结果是"Smith"。这是因为我们在changeName函数中修改了person对象引用的属性,所以这个修改会影响到原始的对象。

尽管称之为引用传递,但在Java中,实际上是通过值传递来传递对象引用的。这意味着对对象进行的修改可以在函数内部被保留和访问,但对参数引用本身的修改将不会影响到原始的引用。

综上所述,Java函数的参数传递方式是通过值传递。对于基本数据类型,传递的是值本身的副本,对副本的修改不会影响到原始值。对于对象类型,传递的是对象引用的副本,对副本的修改可以影响到原始对象的属性。