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

如何在Java中引用传递参数和值传递参数

发布时间:2023-06-25 13:55:10

Java是一门面向对象的编程语言,它是一种强类型语言,因此在Java中想要传递参数,需要对参数类型进行明确的定义。在Java中,参数传递有两种方式,一种是引用传递,一种是值传递。

1. 引用传递

当我们要在一个方法中使用对象时,实际上是使用该对象的引用(地址),这时候,我们可以通过该引用来修改该对象的属性或调用该对象的方法。这就是Java中的引用传递。

我们来看一个例子:

public class User {
    private int age;
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
}

public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setAge(20);
        changeUser(user);
        System.out.println(user.getAge());
    }
    public static void changeUser(User user) {
        user.setAge(30);
    }
}

运行上面的程序,结果为:

30

我们发现,通过changeUser方法中的user对象,我们修改了user的age属性为30,并最终输出了修改后的值。

这里需要注意的是,在Java中,虽然我们可以通过引用修改对象的属性,但我们无法修改引用本身指向的对象。也就是说,方法中修改参数对象指向的另一个对象,不会对原对象造成任何影响。

public class User {
    private int age;
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
}

public class Test {
    public static void main(String[] args) {
        User user1 = new User();
        user1.setAge(20);
        User user2 = new User();
        user2.setAge(30);
        swapUser(user1, user2);
        System.out.println("user1 age:"+user1.getAge()+" user2 age:"+user2.getAge());
    }
    public static void swapUser(User user1, User user2) {
        User tempUser = user1;
        user1 = user2;
        user2 = tempUser;
    }
}

运行上面的程序,结果为:

user1 age:20 user2 age:30

我们发现,虽然在swapUser方法中改变了user1和user2的指向关系,但在main方法中,原来的引用并没有改变,仍然指向原来的对象。

2. 值传递

值传递是指将方法外的变量值传递给方法内部的形参,方法内部的形参对它的改变不会影响到原变量的值。Java中,基本类型的参数传递是值传递。

我们来看一个例子:

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

运行上面的程序,结果为:

10

我们发现,在changeNum方法中虽然改变了num的值,但并不影响原变量num的值。

需要注意的是,如果传递的是一个对象类型的变量,虽然对象本身是引用类型,但在方法内部对对象作出的改变会影响到原对象的值。这是因为对象本身是在堆内存中存放的,而对象的引用是在栈内存中存放的。

public class User {
    private int age;
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
}

public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setAge(20);
        changeUserAge(user);
        System.out.println("user age:"+user.getAge());
    }
    public static void changeUserAge(User user) {
        user.setAge(30);
    }
}

运行上面的程序,结果为:

user age:30

我们发现,在changeUserAge方法中改变了user对象的年龄属性,但在main方法中输出的对象年龄属性也发生了改变。

结论

在Java中,基本类型是值传递,而对象类型是引用传递。引用传递可以对对象的属性进行改变,但无法改变对象引用指向的对象。值传递也可以对对象作出改变,但无法改变原对象的引用指向的对象。