Java值传递

先上一个Java代码,试判断str0,str1,person前后的变化

public class Test {
    public static void main(String[] args) {
        String str0 = "str0";
        String str1 = new String("str1");
        Person person = new Person("person");
        System.out.println("==========before===========");
        System.out.println(str0.getClass().getName() + ":" + str0);
        System.out.println(str1.getClass().getName() + ":" + str1);
        System.out.println(person.getClass().getName() + ":" + person.getName());
        func1(str0);
        func1(str1);
        func2(person);
        System.out.println("==========after===========");
        System.out.println(str0.getClass().getName() + ":" + str0);
        System.out.println(str1.getClass().getName() + ":" + str1);
        System.out.println(person.getClass().getName() + ":" + person.getName());
    }

    public static void func1(String str) {
        str = "chg_str";
    }

    public static void func2(Person person) {
        person.setName("chg_person");
    }
}

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

运行后结果:

可以看到:str0,str1的值没有改变,person的name发生了改变。
下面进行分析:
进入函数前的草图:
在进入到函数之前,每个对象的引用指向其对象的内存的位置

进入函数作用域之后,函数为对象的引用创建了一个临时的复制。这是我们将str0、str1指向内存中的新创建的对象。

函数作用域结束后,临时引用消失,此时的str0所代表的仍是str0并未发生改变。整个函数过程中我们是对临时对象进行的操作。

总结:与其说Java的引用概念相对于C++中的引用,我觉得指针更为贴切。
但是这是针对其数据类型,而在其函数处理的传参过程中,其步骤都是先建立一个传入数据的复制,因此Java的传参方式始终是值传递

posted @ 2020-03-20 21:01  re_get  阅读(128)  评论(0)    收藏  举报