MST

星途 面试题库

面试题:Java 中值传递与引用传递在方法调用中的基础差异

请详细阐述在 Java 方法调用中,值传递和引用传递的基本概念,并举例说明它们在传递简单数据类型和对象类型时的不同表现。
34.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

值传递概念

在Java中,值传递意味着方法接收的是调用者提供的实际参数值的副本。对于基本数据类型,传递的是该数据的值本身。例如,在方法调用时,将一个int类型变量的值复制一份传递给方法。这意味着在方法内部对该参数的修改不会影响到调用者代码中的原始变量。

引用传递概念

Java中严格来说只有值传递,但对于对象类型参数,传递的是对象引用的副本。当把一个对象作为参数传递给方法时,实际上传递的是该对象在内存中的地址的副本。通过这个副本,方法可以访问和修改对象的属性,但不能改变调用者代码中引用所指向的对象(除非重新赋值)。

传递简单数据类型示例

public class ValuePassingExample {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("Before method call: num = " + num);
        changeValue(num);
        System.out.println("After method call: num = " + num);
    }

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

在上述代码中,main方法里定义了一个int类型变量num并赋值为10。调用changeValue方法时,传递num的值的副本。在changeValue方法内部修改number的值为20,但是这并不会影响到main方法中num的原始值,输出结果为:

Before method call: num = 10
After method call: num = 10

传递对象类型示例

class Person {
    String name;

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

public class ReferencePassingExample {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        System.out.println("Before method call: person.name = " + person.name);
        changeName(person);
        System.out.println("After method call: person.name = " + person.name);
    }

    public static void changeName(Person p) {
        p.name = "Bob";
    }
}

在这个例子中,main方法创建了一个Person对象并初始化其name为"Alice"。调用changeName方法时,传递person对象引用的副本。在changeName方法内部通过这个引用副本修改Person对象的name属性为"Bob",由于引用副本指向同一个对象,所以main方法中person对象的name属性也被改变了,输出结果为:

Before method call: person.name = Alice
After method call: person.name = Bob

如果尝试在changeName方法中重新赋值引用,如p = new Person("Charlie");,这只会改变方法内部的引用副本所指向的对象,而不会影响main方法中person引用所指向的对象。