Java是如何處理別名(aliasing)的


什么是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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM