Java值传递和引用传递的区别(附带实例)
在 Java 中,将数据作为参数传递给方法的方式有两种,分别是值传递(Pass by Value)和引用传递(Pass by Reference)。
【实例】自定义类 SimpleValue,实现基本类型数据的参数传递。
【实例】自定义类 ReferenceValue,实现引用数据的参数传递。
总结一下,Java 语言中基本类型数据传递是传值调用,对象的参数传递是引用调用。
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
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 = 4main() 方法中首先生成 obj 对象,并给其成员变量 x 赋值为 5。接下来调用类中定义的方法 change()。在 change() 方法调用时把 main() 方法的 obj 的值赋给 change() 方法中的 obj,使其指向同一内容。change() 方法结束,change() 中的 obj 变量被释放,但堆内存的对象仍然被 main() 方法中的 obj 引用,就会看到 main() 方法中的 obj 所引用的对象的内容被改变。
总结一下,Java 语言中基本类型数据传递是传值调用,对象的参数传递是引用调用。