关于“=”赋值的问题

一、=的含义

    假设有两个基本变量,一个是lhs,另一个是rhs,它们分别表示左侧(left-hand side) 和右侧(right-hand side)那么赋值语句:

lhs = rhs;     的含义是:将存储在rhs中的值复制到基本变量lhs。随后lhs或rhs的变化并不影响rhs或 lhs。

    对于对象,=的含义是一样的:将存储值复制。如果lhs和rhs是引用(兼容类型),那 么在赋值语句之后,lhs和rhs将指向相同的对象。在此,只是复制地址。lhs指向的对象是 lhs不再引用的对象。如果lhs是该对象的唯一引用,那么该对象现在没有任何引用,要进行垃圾回收。注意,并不复制对象,只复制对象的引用。

二、实际代码测试

关于“=”赋值的问题_第1张图片
图为基本类型把a赋值给b,a与b互不影响(值复制),引用类型把c赋值给d,c与d互相影响(地址赋值),特殊的引用类string,以及引用类的地址
关于“=”赋值的问题_第2张图片
图为输出结果

    基本类型变量,赋值时是值的复制,赋值后,改变左右一方的值,对另一方没有影响。

    引用类型变量,赋值时是把=右边的地址复制,左右指向同一地址,改变其中一值时,改变的是值,地址并没有改变,所以双方都有影响。

    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

关于“=”赋值的问题_第3张图片
point1和point3引用了存储在内存位置1000的Point对象。point2引用了存储在内存位置1024的Point对象。变量存储的内存位置是随机的

    通过将point2的存储值赋值给point3,使point3 所引用的对象与point2的引用对象相同(见下图)。现在point2==point3的值为true,因为point2和point3都储存在1024这个内存地址中,从而引用了相同的对象。point1 ! = point2也是true, 因为point1和point2引用不同的对象。

关于“=”赋值的问题_第4张图片
 point3=point2的结果是point3现在与point2引用相同的对象            

参考文章《数据结构与问题求解(Java语言版)(第4版)》

你可能感兴趣的:(关于“=”赋值的问题)