优秀的编程知识分享平台

网站首页 > 技术文章 正文

详细介绍一下Java中的什么是值传递?什么是引用传递?

nanyue 2024-10-22 13:11:30 技术文章 13 ℃

Java中的参数传递是通过值传递进行的,即使是对象也是遵循这个规则,想要了解这个原理,首先我们就需要了解什么是值传递,什么是引用传递?

值传递

值传递是在调用方法的时候,方法接收到的参数是实际参数的一个副本值。所以,在方法内部对参数修改不会影响到原始参数的值。如下所示

public class ValuePassExample {
    public static void main(String[] args) {
        int number = 5;
        System.out.println("Before calling changeValue: " + number); // 输出 5
        changeValue(number);
        System.out.println("After calling changeValue: " + number);  // 输出 5
    }

    public static void changeValue(int num) {
        num = 10;
    }
}

在上面这个例子中,当number被作为参数传递到changeValue方法的时候,实际上传递的是number的一个副本值,而在changeValue方法中,对num的修改并不会影响到main函数中的number变量的值。

引用传递

对于对象类型,传递的也是引用的副本(引用的值),而不是对象本身。对象的引用值传递的副本依然是值传递,但由于引用指向同一个对象,方法内通过引用修改对象的属性会影响到原始对象。如下所示

public class ReferencePassExample {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        System.out.println("Before calling changePersonName: " + person.getName()); // 输出 Alice
        changePersonName(person);
        System.out.println("After calling changePersonName: " + person.getName());  // 输出 Bob

        changePerson(person);
        System.out.println("After calling changePerson: " + person.getName());  // 输出 Bob
    }

    public static void changePersonName(Person p) {
        p.setName("Bob");
    }

    public static void changePerson(Person p) {
        p = new Person("Charlie");
    }
}

class Person {
    private String name;

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

    public String getName() {
        return name;
    }

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

在这个例子中,person对象的引用被传递到了changePersonName方法中,而在这个方法的内部通过引用修改了对象的属性值,这种修改对于外部的对象是可见的。

而在changePerson方法中,对p重新赋值,但这只是改变了p的引用,原始的person引用并未改变,因此方法外部无法看到这种修改。

总结

Java 中只有值传递

  • 对于基本类型,传递的是值的副本。
  • 对于对象类型,传递的是引用的副本(即引用的值)。

尽管对象引用是值传递的,但由于引用指向同一个对象,通过引用修改对象的属性会影响到原始对象。然而,引用本身的重新赋值不影响原始引用。因此,可以总结为:Java 中所有参数都是通过值传递的,不存在引用传递。

最近发表
标签列表