一、=的含义
假设有两个基本变量,一个是lhs,另一个是rhs,它们分别表示左侧(left-hand side) 和右侧(right-hand side)那么赋值语句:
lhs = rhs; 的含义是:将存储在rhs中的值复制到基本变量lhs。随后lhs或rhs的变化并不影响rhs或 lhs。
对于对象,=的含义是一样的:将存储值复制。如果lhs和rhs是引用(兼容类型),那 么在赋值语句之后,lhs和rhs将指向相同的对象。在此,只是复制地址。lhs指向的对象是 lhs不再引用的对象。如果lhs是该对象的唯一引用,那么该对象现在没有任何引用,要进行垃圾回收。注意,并不复制对象,只复制对象的引用。
二、实际代码测试
基本类型变量,赋值时是值的复制,赋值后,改变左右一方的值,对另一方没有影响。
引用类型变量,赋值时是把=右边的地址复制,左右指向同一地址,改变其中一值时,改变的是值,地址并没有改变,所以双方都有影响。
String 是引用类型,参数传递是引用传递,但参数改变,并不影响原地址所指向的值发生变化,因为参数改变,只是改变了引用,并没有改变传递进来的引用所指向的值。
三、关于引用
在Java中,除了基本类型外, 所有其他类型都是引用类型,这些引用类型包括字符串、数组和文件流。 在Java中引用变量(经常缩写引用)是一个变量,它用来存储对象所在的内存地址。
有两个对象(见下图),j在内存中的存储位置分别是1000和1024。对这两个对象,有三个引用变量:points、point2和 point3。 point 1和point3都引用存储在内存位置1000的对象;point2引用存储在内存位置 1024的对象。point 1和point3的存储值是1000, point2的存储值是1024。像1000 和1024这样的实际位置,都是系统运行时根据自身的判断进行分配的(当系统发现可用内存时)。因此,在外部不能像使用数一样使用这些值。不过,point1和point3存储相同值这 一事实是非常有用的:这意味着它们引用了同一个对象。j
通过将point2的存储值赋值给point3,使point3 所引用的对象与point2的引用对象相同(见下图)。现在point2==point3的值为true,因为point2和point3都储存在1024这个内存地址中,从而引用了相同的对象。point1 ! = point2也是true, 因为point1和point2引用不同的对象。
参考文章《数据结构与问题求解(Java语言版)(第4版)》