📅  最后修改于: 2023-12-03 15:02:04.998000             🧑  作者: Mango
在Java中,传递参数的方式有两种:值传递和引用传递。这两种传递方式在很多情况下会被程序员所混淆。本文将针对Java的值传递做出详细的介绍。
值传递,就是将实参的值复制一份,传递给形参,让形参和实参的值完全独立,互不影响。当形参发生改变时,不会影响到实参的值。这种传递方式常见于基本数据类型和字符串类型。下面是一个例子:
public class Example {
public static void main(String[] args) {
int a = 1;
int b = 2;
swap(a, b);
System.out.println("a=" + a + " b=" + b);
}
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
}
输出结果为:
a=1 b=2
在这个例子中,我们声明了一个swap
方法用于交换参数的值,但是打印出来的结果却没有发生变化,因为在方法内部对参数进行的操作并不会影响到外部的实参,这就是值传递的特点。
Java只支持按值传递,不支持按引用传递。也就是说,Java中的所有参数传递都是以值传递的方式进行的。
不仅基本数据类型和字符串类型如此,即使传递对象的时候,也是将对象的引用(地址)复制一份,传递给形参。因此,如果在方法内部改变了形参所引用的对象的属性,这个改变将持续到方法结束。但是,如果在方法内部重新为形参赋值(例如:p=new Person()
),这个赋值并不会影响到调用者所引用的那个对象。
下面是一个例子:
public class Example {
public static void main(String[] args) {
Person p = new Person("Tom", 18);
changePerson(p);
System.out.println("name=" + p.getName() + " age=" + p.getAge());
}
public static void changePerson(Person person) {
person.setAge(20);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
输出结果为:
name=Tom age=20
在这个例子中,我们声明了一个Person
类,其中有name
和age
两个属性,还定义了一个changePerson
方法,用于修改传入的Person
对象的age
属性。但是,在调用changePerson
方法后,我们再次输出Person
对象的age
属性时,它已经被修改成了20
,说明方法内部的修改是生效的。
Java中只支持按值传递,不支持按引用传递。在Java中,基本数据类型和字符串类型通过值传递,而对象类型则是将其引用复制一份后传递,但是对于对象属性的修改会影响到原对象的属性值。