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

Java中的函数参数传递

发布时间:2023-05-27 08:49:22

Java中的函数参数传递是指在调用函数时,将数据传递给函数。Java支持两种传递参数的方式:值传递和引用传递。

值传递:将一个变量的值复制一份,传递给函数,函数对这份值的修改不会影响原变量。

引用传递:将一个变量的地址复制一份,传递给函数,函数对这份地址所对应的变量进行修改时,原变量也会受到影响。

下面我们来分别详细讨论一下这两种传递方式。

值传递

在Java中,基本数据类型(如int、double、char等)以及String类型都是通过值传递来进行函数参数传递的。例如:

public class ValueTransfer {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println(num); //打印结果为10,说明对原变量num没有影响
    }
 
    public static void changeValue(int n) {
        n = n + 10;
    }
}

在上面的例子中,定义了一个整型变量num,并将其值设置为10。然后调用changeValue()函数,并将num传递给该函数。函数中对参数n进行了修改,但是并没有对原变量num进行修改。所以最后打印的结果为10。

引用传递

在Java中,对象类型也可以作为函数参数进行传递,而对象类型是通过引用传递来进行函数参数传递的。例如:

public class ReferenceTransfer {
    public static void main(String[] args) {
        Person p = new Person("张三", 18);
        changePerson(p);
        System.out.println(p.getName()); //打印结果为李四,说明原变量p的值被修改了
    }
 
    public static void changePerson(Person person) {
        person.setName("李四");
    }
}
 
class Person {
    private String name;
    private int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}

在上面的例子中,定义了一个Person对象p,并将其姓名设置为“张三”,年龄设置为18。然后调用changePerson()函数,并将p传递给该函数。函数中对参数person所表示的对象的姓名进行了修改,由“张三”修改为“李四”。最后打印p的姓名为“李四”,说明原变量p的值被修改了。

需要注意的是,虽然对象类型是通过引用传递进行函数参数传递的,但是如果在函数中改变了参数所表示的对象的引用,那么原变量不会受到影响。例如:

public class ReferenceTransfer2 {
    public static void main(String[] args) {
        User user1 = new User("张三");
        changeUser(user1);
        System.out.println(user1.getName()); //打印结果为张三,说明原变量user1没有受到影响
         
        User user2 = new User("李四");
        changeUser2(user2);
        System.out.println(user2.getName()); //打印结果为王五,说明原变量user2受到了影响
    }
 
    public static void changeUser(User user) {
        user = new User("王五");
    }
 
    public static void changeUser2(User user) {
        user.setName("王五");
    }
}
 
class User {
    private String name;
 
    public User(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

在上面的例子中,定义了一个User对象user1,并将其姓名设置为“张三”。然后调用changeUser()函数,并将user1传递给该函数。函数中对参数user所表示的对象进行了重新赋值操作,赋值为一个新的User对象。但是,最后打印user1的姓名仍为“张三”,而不是重新赋值的“王五”。这是因为,虽然在函数中改变了参数user所表示的对象的引用,但是原变量user1并没有受到影响。

另一方面,上面的例子中还定义了一个User对象user2,并将其姓名设置为“李四”。然后调用changeUser2()函数,并将user2传递给该函数。函数中对参数user所表示的对象的姓名进行了修改,由“李四”修改为“王五”。最后打印user2的姓名为“王五”,说明原变量user2受到了影响。

如何选择传递方式?

在Java中,对于基本数据类型,一般使用值传递,因为基本数据类型的内容是简单的数值,相互之间没有关联。而对于对象类型,一般使用引用传递,因为对象类型的内容是复杂的数据结构,相互之间可能会存在关联。如果使用值传递的话,会对内存造成很大的浪费。

需要注意的是,在Java中,即使是对象类型,也可能需要使用值传递。比如,当在函数中仅仅需要读取一个对象的属性时,只需要将属性值复制一份即可,完全没有必要传递整个对象。如果使用引用传递,会对内存造成很大浪费。

总结

Java中的函数参数传递支持两种方式:值传递和引用传递。基本数据类型和字符串类型通过值传递传递给函数,而对象类型通过引用传递来传递给函数。对于基本数据类型,一般使用值传递,对于对象类型,一般使用引用传递。但是,在某些情况下,也可能需要使用值传递。在使用函数参数传递时,需要根据具体情况选择合适的传递方式。