首页 > 编程笔记 > Java笔记 阅读:11

Java值传递和引用传递的区别(附带实例)

在 Java 中,将数据作为参数传递给方法的方式有两种,分别是值传递(Pass by Value)和引用传递(Pass by Reference)。

Java值传递

Java 中所有基本数据类型的参数都是传值的,这意味着参数的原始值不能被调用的方法改变。下面通过一个例子演示传值调用的方法。

【实例】自定义类 SimpleValue,实现基本类型数据的参数传递。
class SimpleValue {
    public static void change(int x) {
        x = 4;
    }

    public static void main(String[] args) {
        int x = 5;
        System.out.println("方法调用前 x = " + x);
        change(x);
        System.out.println("change方法调用后 x = " + x);
    }
}
程序运行结果为:

方法调用前 x = 5
change方法调用后 x = 5

执行 change() 方法后,没有改变 main() 方法中传递过来的变量 x 的值,最后的输出结果仍然是 5。由此可见,在传值调用过程中,参数值的一份拷贝传给了被调用方法,把它放在一个独立的内存单元。因此,当被调用的方法改变参数的值时,这个变化不会反映到调用方法里。

Java引用传递

对象的引用并不是对象本身,它只是对象的一个句柄(名称)。一个对象可以有多个句柄,就好像一个人可以有多个姓名(如中文名、英文名等)。下面通过一个示例演示引用传递的方法。

【实例】自定义类 ReferenceValue,实现引用数据的参数传递。
class ReferenceValue {
    int x;
    public static void change(ReferenceValue obj) {
        obj.x = 4;
    }

    public static void main(String[] args) {
        ReferenceValue obj = new ReferenceValue();
        obj.x = 5;
        System.out.println("chang方法调用前的 x = " + obj.x);
        change(obj);
        System.out.println("chang方法调用后的 x = " + obj.x);
    }
}
程序运行结果为:
chang方法调用前的 x = 5
chang方法调用后的 x = 4
main() 方法中首先生成 obj 对象,并给其成员变量 x 赋值为 5。接下来调用类中定义的方法 change()。在 change() 方法调用时把 main() 方法的 obj 的值赋给 change() 方法中的 obj,使其指向同一内容。change() 方法结束,change() 中的 obj 变量被释放,但堆内存的对象仍然被 main() 方法中的 obj 引用,就会看到 main() 方法中的 obj 所引用的对象的内容被改变。

总结一下,Java 语言中基本类型数据传递是传值调用,对象的参数传递是引用调用。

相关文章