在 Java 中,参数传递只有一种方式:值传递(pass by value)。不过因为 Java 有“基本类型”和“引用类型”的区别,很多人会误以为是“引用传递”。下面详细说明。
传递的是“值的副本”,方法内修改不会影响原变量。
public static void change(int x) {
x = 10;
}
public static void main(String[] args) {
int a = 5;
change(a);
System.out.println(a); // 输出 5
}
✅ 原因:a 的值 5 被复制给 x,x 的改变不影响 a
传递的是“引用的副本”(不是对象本身,也不是引用传递)
class Person {
int age;
}
public static void grow(Person p) {
p.age = 20;
}
public static void main(String[] args) {
Person person = new Person();
person.age = 10;
grow(person);
System.out.println(person.age); // 输出 20
}
✅ 原因:
person 和 p 指向同一个对象p.age)会影响原对象如果在方法里让参数指向新对象,原引用不受影响
public static void reset(Person p) {
p = new Person(); // 只改变 p 的指向
p.age = 99;
}
public static void main(String[] args) {
Person person = new Person();
person.age = 10;
reset(person);
System.out.println(person.age); // 输出 10
}
✅ 原因:
p 只是 person 的副本p = new Person() 只改了 ppublic static void modify(int[] arr) {
arr[0] = 100;
}
public static void main(String[] args) {
int[] a = {1, 2, 3};
modify(a);
System.out.println(a[0]); // 100
}
Java 永远是值传递
- 基本类型:传“值”
- 引用类型:传“引用的值(地址副本)”
如果你愿意,我也可以:
String 为什么看起来像“传值”你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。