文章出處

什么是Java別名(aliasing)

別名意味著有多個別名指向同一個位置,且這些別名有不同的類型。

在下面的代碼例子中,a和b是兩個不同的名字,有不同的類型A和B,B繼承A

B[] b = new B[10];
A[] a = b;
a[0] = new A();
b[0].methodParent();

在內存中,它們指向了同一個位置,如下:

內存中的該位置同時被a和b指向,在運行期間,方法的調用由實際存儲的對象來決定。

Java是如何處理別名問題的

如果你拷貝以下代碼到你的瀏覽器,會發現沒有編譯錯誤,

package simplejava;

class A {
    public void methodParent() {
        System.out.println("method in Parent");
    }
}

class B extends A {
    public void methodParent() {
        System.out.println("override method in Child");
    }

    public void methodChild() {
        System.out.println("method in Child");
    }
}

public class Q20 {

    public static void main(String[] args) {
        B[] b = new B[10];
        A[] a = b;
        a[0] = new A();
        b[0].methodParent();
    }

}

但是當你運行以上代碼的時候,結果會輸出如下錯誤信息:

Exception in thread "main" java.lang.ArrayStoreException: simplejava.A
    at simplejava.Q20.main(Q20.java:24)

原因是因為Java是在運行期間處理別名的,在運行期間,知道第一個元素應該是B對象,而不是A對象。

因此,如果代碼改成如下所示將會運行成功:

B[] b = new B[10];
A[] a = b;
a[0] = new B();
b[0].methodParent();

結果打印:

override method in Child

 

譯文鏈接:http://www.programcreek.com/2012/12/how-does-java-handle-aliasing/


文章列表


不含病毒。www.avast.com
文章標籤
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣(103)