总结:Java传递所有参数都是使用传值的方式,没有什么传引用,也没有什么传地址。
首先我们需要理解几个常用的名词:对象、实例、引用、变量
1)对象:其实也就是实例,我们经常这样定义类的实例为对象。在Java中对象就是一个 new Object() 过程中所创建的内存空间(系统的栈中),然而他的返回值并不是对象本身,只是对象的一个引用,这个引用会在堆中分配唯一的空间,有的人就叫他为地址,我的理解是:可以认为这是对象的地址,也可以认为他是对象的ID,不过有一点必须确定:他是不可改变的(静态)(C++中地址是可以通过运算改变的,所以有传址一说)。
2)实例:就是对象。
3)引用:对象在Java中是不能够直接获取的,他是一个内存空间,我们只能通过引用间接获取再来修改他的内容。对象的引用其实就是一个指向这个对象内存的值。 Object obj = new Object(); 那么 obj的值 就是一个 new Object() 的引用。变量接收的值就是引用。
4)变量:可分为基础类型变量和引用类型变量,基础类型变量就是基本数据类型的变量,引用类型的变量就是引用类型的的变量。Object obj;那么obj就是一个变量,给他赋的值就是一个引用,引用具体指向了对象。
5)一个对象可以有多个引用,因为一个对象都只有一份内存空间,所以对象所有的引用都是相同的,从而,通过一个引用改变了对象会导致其他引用也发生改变。
6)为一个变量赋值就是为这个变量指定一个引用, 这个变量通过这个引用就可以找到对应的对象,那么引用是变量与对象的桥梁。变量赋值只是让这个变量指向一个引用,因此不可能改变引用所指向的对象本身。首先明确一点Java中对象的地址是不可能改变的,那么我们只能改变这个对象的内容,修改内容必须通过引用间接修改,所以,只能是通过变量获取引用后对值修改才能改变对象的内容。
程序如下:
Object obj1 = new Object();
// 变量与变量之间赋值其实就是把引用传递给变量,并不是变量指向变量,所以,变量之间赋值只是改变变量对引用的具体指向
Object obj2 = obj1;
Object obj3 = obj1;
Object obj4 = new Object();
// 改变obj3变量的指向,但是他不会影响他之前指向的对象,同时obj1还是指向原来的对象
obj3 = obj4;
最后:
回到正题,Java中为什么就只有传值没有传址呢?无论是变量赋值还是方法中传参,都是一样的只是传值,这个值就是引用。因为把引用传入给其他变量,从而其他变量也可以修改对应的对象。方法中传参也是一个道理。总之:想要修改一个对象的内容,必须是通过引用改变对象的属性值,而不能通过为变量赋值改变内容,为变量赋值只是改变变量的具体引用指向。只要明白,赋值的过程是改变变量所指向的引用对象而不是对象的副本。
另外,关于原始类型变量的传值就不多说了,这个都知道。