Java 是值传递
Java 中的所有参数传递都是值传递。当你将一个对象作为参数传递给方法时,传递的是对象引用的副本,而不是对象本身。
值传递与引用传递基本概念
- 值传递(Pass-by-Value):调用方法时,方法接收到的是实际参数值的一个副本。对副本的修改不会影响实际参数本身。
- 引用传递(Pass-by-Reference):调用方法时,方法接收到的是实际参数的引用(地址)。对引用的修改会直接影响实际参数。
举例说明
下面的例子说明了 Java 的值传递行为:
public class Test {
public static void main(String[] args) {
int primitiveValue = 5;
System.out.println("Before calling modifyPrimitive: " + primitiveValue);
modifyPrimitive(primitiveValue);
System.out.println("After calling modifyPrimitive: " + primitiveValue);
MyObject obj = new MyObject();
obj.value = 10;
System.out.println("Before calling modifyObject: " + obj.value);
modifyObject(obj);
System.out.println("After calling modifyObject: " + obj.value);
MyObject anotherObj = new MyObject();
anotherObj.value = 20;
System.out.println("Before calling reassignObject: " + anotherObj.value);
reassignObject(anotherObj);
System.out.println("After calling reassignObject: " + anotherObj.value);
}
public static void modifyPrimitive(int number) {
number = 10;
}
public static void modifyObject(MyObject object) {
object.value = 100;
}
public static void reassignObject(MyObject object) {
object = new MyObject();
object.value = 200;
}
}
class MyObject {
int value;
}
解释
-
对原始类型的修改(primitive):
int primitiveValue = 5; modifyPrimitive(primitiveValue);
在
modifyPrimitive
方法中,number
是primitiveValue
的一个副本。所以对number
的修改不会影响primitiveValue
。 -
对对象字段的修改:
MyObject obj = new MyObject(); obj.value = 10; modifyObject(obj);
在
modifyObject
方法中,object
是obj
引用的副本。对象引用本身是一个被复制的值,但它仍然指向同一个对象。因此,方法可以修改对象的字段,所以obj.value
变成了 100。 -
对对象引用的重新赋值:
MyObject anotherObj = new MyObject(); anotherObj.value = 20; reassignObject(anotherObj);
在
reassignObject
方法中,object
是anotherObj
引用的副本。当object
被重新赋值为一个新的MyObject
实例时,这个赋值操作只影响object
引用的副本,并不影响anotherObj
。因此,修改object.value
不会影响到anotherObj
。