首先,java中只有值传递方式。那问题来了,看下面这段代码
class Person{
public String name;
public int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
}
class Test{
public static void updateName(Person person){
person.name = "qicha";
}
public static void main(String[] args) {
Person person = new Person("mogu", 20);
updateName(person);
System.out.println(person.name);
}
}
inputs:qicha
看到输出,可能就会有疑问了?不是只能值传递吗?为什么修改成功了呢?????
虽然java只有值传递,但是在传递对象的时候,并不会传递这个对象,传的是对象的引用。也就是说update里面的person和main里面的person指向的是同一块内存。
所以可以通过引用修改对象中的属性。
如果说我们直接在update中修改这个对象呢,重新new一个,这样是不可以的,重新new一个实际上是将新的地址,那可能又有新的问题了,不是指向同一块地址吗?
原因是因为update里的person此时指向了新的地址。
这是因为,程序中,不同变量存放的位置不同,变量名存放在栈区,而new的内容存放在堆区。