基本数据类型(如 int
, double
等):
当你传递一个基本数据类型的参数时,传递的是这个值的副本。因此,在方法内部对参数的修改不会影响到原来的值。
引用类型(如 对象
, 数组
等):
当你传递一个对象或数组时,传递的实际上是引用的副本(即指向对象的地址)。因此,在方法内部通过引用修改对象的属性会影响到原来的对象,但如果你在方法内部修改了引用本身(让它指向一个新的对象),则不会影响原来的对象。
public class Main {
public static void main(String[] args) {
int num = 10;
modifyValue(num);
System.out.println("After method call, num: " + num); // 输出:After method call, num: 10
}
static void modifyValue(int n) {
n = 20; // 修改的是 n 的副本
}
}
在这个例子中,num
传递给 modifyValue
方法时,n
是 num
的副本,修改 n
不会影响原来的 num
。
class Dog {
String name;
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "Buddy";
modifyDogName(myDog);
System.out.println("After method call, dog's name: " + myDog.name); // 输出:After method call, dog's name: Max
}
static void modifyDogName(Dog dog) {
dog.name = "Max"; // 修改了 dog 引用指向的对象的属性
}
}
在这个例子中,myDog
传递给 modifyDogName
方法时,dog
是 myDog
引用的副本。通过这个副本修改对象的属性(即 name
),会影响到原来的对象。
class Dog {
String name;
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "Buddy";
reassignDog(myDog);
System.out.println("After method call, dog's name: " + myDog.name); // 输出:After method call, dog's name: Buddy
}
static void reassignDog(Dog dog) {
dog = new Dog(); // 重新分配 dog 引用,不影响原始引用
dog.name = "Max";
}
}
在这个例子中,方法内部 dog
引用了一个新的对象,但这不会影响到 myDog
,因为它们是不同的引用。myDog
仍然指向原来的对象,因此 name
仍然是 "Buddy"
。
Java 中参数传递始终是按值传递。当你传递基本数据类型时,传递的是值的副本;当你传递引用类型时,传递的是引用的副本。这意味着你可以通过引用修改对象的状态,但不能改变原始引用本身。