马士兵java架构师

您现在的位置是:架构师问答 >

架构师问答

java引用传递和值传递的区别

2023-11-24 16:16:24架构师问答 本文浏览次数:1 百度已收录

本 文 目 录

java引用传递和值传递的区别

在Java中,参数的传递方式是值传递。这意味着当我们将一个变量作为参数传递给方法时,方法接收到的是该变量的副本,而不是原始变量本身。但是,如果传递的是对象的引用,那么实际上传递的是对象在内存中的地址,这被称为引用传递。

1. 引用传递与值传递的定义

值传递:将实际参数复制一份传给方法内部的形参,所以方法操作的只是副本,不会影响到实际参数。

引用传递:将实际参数的地址传给方法内部的形参,所以在方法内部对形参的操作会影响到实际参数。

2. 值传递示例

以下是一个关于基本数据类型(如int、char等)的值传递的例子:

public class Main {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println(num); // 输出10,num的值没有改变
    }

    public static void changeValue(int value) {
        value = 20;
    }
}

在这个例子中,我们看到即使在changeValue方法中改变了value的值,但在main方法中,num的值仍然保持为10。这就是因为Java使用的是值传递。

3. 引用传递示例

以下是一个关于对象的引用传递的例子:

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John");
        changePerson(person);
        System.out.println(person.getName()); // 输出"New Name",person的name属性被改变了
    }

    public static void changePerson(Person person) {
        person.setName("New Name");
    }
}

class Person {
    private String name;

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

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

    public String getName() {
        return name;
    }
}

在这个例子中,我们看到即使在changePerson方法中改变了personname属性,但在main方法中,personname属性也发生了变化。这是因为虽然我们在方法中传递的是person的副本,但这个副本实际上是person在内存中的地址,因此在方法中对person的操作会影响到原始的person

4. 总结与注意事项

总结来说,Java的参数传递方式是值传递,但如果传递的是对象的引用,那么实际上是对对象在内存中的地址进行传递,这可以理解为引用传递。需要注意的是,虽然我们可以修改传递的对象的属性,但我们不能修改对象本身的引用。

5. 完整代码示例

完整的代码如下:

public class Main {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println(num); // 输出10

        Person person = new Person("John");
        changePerson(person);
        System.out.println(person.getName()); // 输出"New Name"
    }

    public static void changeValue(int value) {
        value = 20;
    }

    public static void changePerson(Person person) {
        person.setName("New Name");
    }
}

class Person {
    private String name;

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

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

    public String getName() {
        return name;
    }
}