轉自CSDN-詳述 Java 中的別名現象

  在任何編程語言中,賦值操做都是最多見的操做之一,Java 天然也不例外。賦值時,使用賦值操做符=,它的意思是:「將等號右邊的值(右值),複製給左邊的值(左值)」。右值能夠是任何常數、變量或者表達式(只要它能生成一個值就行)。但左值必須是一個明確的、已命名的變量。也就是說,必須有一個物理空間能夠存儲等號右邊的值。例如:git

int a = 4;

就是將一個常數賦給一個變量。可是不能把任何東西賦給一個常數。github

  對於基本數據類型來講,賦值是很簡單的,由於基本數據類型(在堆棧中)存儲了實際的數值,而並不是指向一個對象的引用,全部在爲其賦值的時候,是直接將一個地方的內容複製到了另外一個地方。可是在爲對象「賦值」的時候,狀況卻發生了變化。對一個對象進行操做的時候,咱們真正操做的是對象的引用,因此假若「將一個對象賦值給另外一個對象」,其實是將「引用」從一個地方複製到另外一個地方。這意味着若是對象在賦值的時候用b = c,那麼對象bc都指向本來只有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); } }

如上面所示,咱們創建了兩個書籍對象thinkingInJavaheadFirstPattern,並分別對其價格進行賦值;而後,將對象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); } }

two

如上面所示,當咱們將thinkingInJava = headFirstPattern修改成thinkingInJava.price = headFirstPattern.price以後,別名現象便可消除。code


舒適提示:此內容源於《Java編程思想》,能夠經過閱讀《Java編程思想》瞭解更多的內容。對象

 

原博地址:https://blog.csdn.net/qq_35246620/article/details/77601547blog

相關文章
相關標籤/搜索