java到底是值传递,还是址传递?

289 阅读1分钟

首先,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的内容存放在堆区。

image.png