这一次,彻底解决Java的值传递和引用传递
时间: 2024-03-21 11:42:00 浏览: 17
Java 中的参数传递是值传递。在值传递中,方法调用时实参将自己的值传递给对应的形参,形参接收到的是实参值的一个拷贝。因此,对形参的修改不会影响实参的值。
但是,如果参数是一个对象引用,那么实参和形参都指向同一个对象。因此,对形参对象的操作会改变实参对象的状态。这种情况下,我们可能会认为 Java 中的参数传递是引用传递。
实际上,Java 中的引用也是值。当我们传递一个对象引用作为参数时,实际上传递的是该对象引用的值(即对象在内存中的地址)。所以,Java 中的参数传递仍然是值传递,只是这个值是一个对象引用。
可以通过以下代码来理解:
```java
public class Main {
public static void main(String[] args) {
int x = 1;
addOne(x);
System.out.println(x); // 输出 1
Person p = new Person("Tom");
changeName(p);
System.out.println(p.getName()); // 输出 Jerry
}
public static void addOne(int x) {
x++;
}
public static void changeName(Person p) {
p.setName("Jerry");
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
在 `addOne` 方法中,我们传递了一个整型变量 `x`,`addOne` 方法对 `x` 做了加一操作,但是在 `main` 方法中,`x` 的值仍然是 1,因为 `addOne` 方法只是修改了 `x` 的一个拷贝。
在 `changeName` 方法中,我们传递了一个 `Person` 对象 `p`,`changeName` 方法修改了 `p` 对象的名字为 Jerry。在 `main` 方法中,我们输出 `p.getName()`,输出的是 Jerry,因为 `p` 和 `changeName` 方法中的参数指向的是同一个对象,所以修改 `p` 对象的名字会改变该对象的状态。
因此,Java 中的参数传递是值传递,但是对于对象引用类型的参数,传递的是对象引用的值,也就是对象在内存中的地址。