引言

根据think in Java(java编程思想)的说明,Java只存在值传递。
Java里面的引用,可以理解为指针(实例的地址)。引用型的变量,实际就是指针或者叫实例的地址。
引用型的对象作为参数传给函数时,实际就是把地址拷贝传递过去。

基本型

2.1

  • ①:在Stack里把func1的data的值「5」拷贝到func2的cout。
  • ②:即使修改了func2的cout,func1的data的值,也不会发生变化。
  • ③:这是data的值还是「5」。

引用型

创建一个引用型实例的时候,内存的变化如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    class Person {
        private String name = "unknown";
        private int age = -1;
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }

    Person p1 = new Person("Tom",18);
  • ①函数的Stack里,生成一个p1(可理解为指针)、在heap里分配Person的空间
  • ②设定类的初期值

2.2

设定初期值:

2.3

  • ③通过构造函数设值

2.4

  • ④把实例的地址保存到Stack的p1

2.5

按照上面的顺序,调用函数时如果将[p1]作为参数传入的话,实际上是把p1保存的[0x3000]的值传入,
被调用函数里如果修改传入的实例的内容,函数调用完以后,函数外的p1实例也会被修改。
因为它在堆内存里的实例是同一个,拷来拷去的都是它的的地址(像身份证号码一样)。
下例:「p1.name」的值变为:「"変更"」。

2.6