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

Java函数的参数传递方式--值传递和引用传递

发布时间:2023-06-12 17:30:25

Java中的函数传递参数有两种方式,分别是值传递和引用传递。这两种方式在实际应用中有不同的适用场景,理解这两种方式的优缺点对于编程者来说是非常重要的。

值传递

值传递就是将变量的值传递给函数,它是一种适用于基本数据类型的传递方式。当我们将一个基本数据类型的变量传递给函数时,函数会在堆栈中创建一个新的空间,这个空间里装的是传递进来的变量的值。函数执行完毕后,这个新的空间就被销毁,原来的变量不会发生任何改变。下面是一个示例代码:

public static void main(String[] args){
    int x = 10;
    System.out.println("x = " + x);
    changeValue(x);
    System.out.println("x = " + x);
}

public static void changeValue(int a){
    a = a + 5;
}

在上面的代码中,我们定义了一个变量x,他的值为10。然后我们将这个变量传递给了changeValue()函数,这个函数将变量的值加上了5。但是在main()函数中,我们发现x的值并没有被修改,仍然是10。这个就说明了,值传递是不能够修改原始变量的值。

引用传递

引用传递是将一个对象的引用作为参数传递给函数,它适用于非基本数据类型的传递方式。在引用传递中,函数中的参数和原始变量指向同一个对象,任何对于对象的修改都会影响原始的对象。下面是一个示例代码:

public static void main(String[] args){
    Person p = new Person("Tom", 20);
    System.out.println(p);
    changeValue(p);
    System.out.println(p);
}

public static void changeValue(Person a){
    a.setName("Jerry");
    a.setAge(25);
}

class Person{
    private String name;
    private int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }

    public void setAge(int age){
        this.age = age;
    }

    public int getAge(){
        return this.age;
    }

    @Override
    public String toString(){
        return "Name: " + name + ", Age: " + age;
    }
}

在上面的代码中,我们定义了一个Person类型的对象p,并通过构造函数初始化了它的两个属性“name”和“age”。接着我们将这个对象传递给了changeValue()函数,这个函数将p的属性修改为了“Jerry”和“25”。在main()函数中,我们发现p对象的属性也被修改为了“Jerry”和“25”。这就是引用传递带来的影响。

值传递和引用传递的区别

在代码中,值传递和引用传递的差异是非常明显的。在值传递中,函数得到的是原始变量的副本,而在引用传递中,函数得到的是原始变量的引用,这个引用指向了一个对象。这就带来了一系列的区别:

1.值传递无法修改原始变量的值,引用传递能够修改原始变量引用对象属性的值。

2.引用传递会占用更多的内存空间,因为它需要分配内存空间来存储对象。而值传递只需要分配原始变量的内存空间即可。

3.在函数中,我们可以通过一个if(a==null)的判断语句来判断对象是否为null。然而,在值传递中,我们无法判断原始变量是否为null,因为这个变量的副本始终不为null。

总结

在Java中,函数的参数传递方式有两种,值传递和引用传递。在使用时应该清楚它们的优缺点和适用场景以便更好的使用它们。值传递适用于基本数据类型,引用传递适用于非基本数据类型。在编写程序时,我们应该根据需求选择适当的方式。