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