歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 別名機制

別名現象主要出現在賦值的問題上:

對基本數據類型的賦值是很簡單的.基本數據類型存儲了實際的數值,而並非指向一個對象的引用,所以在為其賦值的時候,是直接將一個地方的內容復制到了另一個地方.例如,對基本數據類型使用a=b,那麼b的內容就復制給a.若接著又修改了a,而b根本不會受這種修改的影響.

但是在為對象"賦值"的時候,情況卻發生了變化.對一個對象進行操作時,我們真正操作的是對對象的引用.所以倘若"將一個對象賦值給另一個對象",實際是將"引用"從一個地方復制到另一個地方.這意味著假若對對象使用c=d,那麼c和d都指向原本只有d的指向的那個對象.下面這個例子將向大家闡述這一點.

package com.glacier.demo; 
 
class Tank { 
    int level; 

 
public class Main { 
 
    /**
    * @param args
    */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        Tank t1 = new Tank(); 
        Tank t2 = new Tank(); 
        t1.level = 9; 
        t2.level = 47; 
        System.out.println("1:  t1.level: " + t1.level + "      t2.level: " 
                + t2.level); 
        t1=t2; 
        System.out.println("2:  t1.level: " + t1.level + "      t2.level: " 
                + t2.level); 
        t1.level=27; 
        System.out.println("3:  t1.level: " + t1.level + "      t2.level: " 
                + t2.level); 
         
    } 
 
}

運行結果:

1:  t1.level: 9      t2.level: 47

2:  t1.level: 47      t2.level: 47

3:  t1.level: 27      t2.level: 27

tank類非常簡單,它的兩個實例(t1和t2)是在main()裡建立的.對每個tank類對象的level域都賦予了一個不同的值,然後,將t2賦給t1,接著有修改了t1.在許多編程語言中,我們可能會期望t1和t2總是相互獨立的.但由於賦值操作的是一個對象的引用,所以修改了t1的同時也改變了t2!這是由於t1和t2包含的是相同的引用,它們指向相同的對象.(原本t1包含的對對象的引用,是指向一個值為9的對象.在對t1賦值的時候,這個引用被覆蓋,也就是丟失了;而那個不再被引用的對象會由"垃圾回收器"自動清理.)

這種特殊的想象通常稱作"別名想象",是java操作對象的一種基本方式.在這個例子中,如果想避免別名問題的話可以這樣寫:

t1.level=t2.level;

這樣便可以保持兩個對象彼此獨立,而不是將t1和t2綁定到相同的對象.但你很快會意識到,直接操作對象內的域容易導致混亂,並且,違背了良好的面向對象程序設計的原則.這可不是一個小的問題,所以從現在開始大家應該留意,為對象賦值可能會產生意想不到的後果.

Copyright © Linux教程網 All Rights Reserved