在任何编程语言中,赋值操做都是最多见的操做之一,Java 天然也不例外。赋值时,使用赋值操做符=
,它的意思是:“将等号右边的值(右值),复制给左边的值(左值)”。右值能够是任何常数、变量或者表达式(只要它能生成一个值就行)。但左值必须是一个明确的、已命名的变量。也就是说,必须有一个物理空间能够存储等号右边的值。例如:git
int a = 4;
就是将一个常数赋给一个变量。可是不能把任何东西赋给一个常数。github
对于基本数据类型来讲,赋值是很简单的,由于基本数据类型(在堆栈中)存储了实际的数值,而并不是指向一个对象的引用,全部在为其赋值的时候,是直接将一个地方的内容复制到了另外一个地方。可是在为对象“赋值”的时候,状况却发生了变化。对一个对象进行操做的时候,咱们真正操做的是对象的引用,因此假若“将一个对象赋值给另外一个对象”,其实是将“引用”从一个地方复制到另外一个地方。这意味着若是对象在赋值的时候用b = c
,那么对象b
和c
都指向本来只有c
指向的那个对象。经过下面的代码示例,咱们将看到这个现象:编程
package com.hit.operator; /** * @Author Charies Gavin * @Date 2017/8/26,下午1:38 * @GitHub https://github.com/guobinhit */ public class Book { int price; }
如上面的代码所示,咱们创建了一个Book
类,用来表示书籍,其仅有一个字段price
,表示书籍的价格。编程语言
package com.hit.operator; /** * @Author Charies Gavin * @Date 2017/8/26,下午1:38 * @GitHub https://github.com/guobinhit */ public class Assignment { public static void main(String[] args) { // 建立两个实体对象 Book thinkingInJava = new Book(); Book headFirstPattern = new Book(); // 分别赋值 thinkingInJava.price = 108; headFirstPattern.price = 68; System.out.println("Thinking In Java : price is " + thinkingInJava.price); System.out.println("Head First Pattern : price is " + headFirstPattern.price); // 将 headFirstPattern (的引用)赋值给 thinkingInJava thinkingInJava = headFirstPattern; System.out.println("Thinking In Java : price is " + thinkingInJava.price); System.out.println("Head First Pattern : price is " + headFirstPattern.price); // 修改 thinkingInJava 的价格(值),半价出售 thinkingInJava.price = 54; System.out.println("Thinking In Java : price is " + thinkingInJava.price); System.out.println("Head First Pattern : price is " + headFirstPattern.price); } }
如上面所示,咱们创建了两个书籍对象thinkingInJava
和headFirstPattern
,并分别对其价格进行赋值;而后,将对象headFirstPattern
的引用赋值给thinkingInJava
;接下来,调用thinkingInJava.price
,修改其价格为半价。最后,运行程序,输出结果。显然,因为对象的赋值是操做的对象引用,所以在咱们改变thinkingInJava
的价格时,headFirstPattern
的价格也随之改变。这种现象,咱们称之为“别名现象”。spa
固然,咱们有时候并不但愿发生别名现象,但如何避免呢?其实,想要避免别名现象也很简单,以上面的代码为例,咱们只须要将对象赋值时的语句略做修改便可,以下所示:.net
package com.hit.operator; /** * @Author Charies Gavin * @Date 2017/8/26,下午1:38 * @GitHub https://github.com/guobinhit */ public class Assignment2 { public static void main(String[] args) { // 建立两个实体对象 Book thinkingInJava = new Book(); Book headFirstPattern = new Book(); // 分别赋值 thinkingInJava.price = 108; headFirstPattern.price = 68; System.out.println("Thinking In Java : price is " + thinkingInJava.price); System.out.println("Head First Pattern : price is " + headFirstPattern.price); // 将 headFirstPattern (的属性值)赋值给 thinkingInJava thinkingInJava.price = headFirstPattern.price; System.out.println("Thinking In Java : price is " + thinkingInJava.price); System.out.println("Head First Pattern : price is " + headFirstPattern.price); // 修改 thinkingInJava 的价格(值),半价出售 thinkingInJava.price = 54; System.out.println("Thinking In Java : price is " + thinkingInJava.price); System.out.println("Head First Pattern : price is " + headFirstPattern.price); } }
如上面所示,当咱们将thinkingInJava = headFirstPattern
修改成thinkingInJava.price = headFirstPattern.price
以后,别名现象便可消除。code
舒适提示:此内容源于《Java编程思想》,能够经过阅读《Java编程思想》了解更多的内容。对象
原博地址:https://blog.csdn.net/qq_35246620/article/details/77601547blog