Java的引用別名機制是什麼?Java的引用別名機制(原文為Aliasing,別名,即Java中的多態)意味著多個引用變量可以定位到同一個實際物理對象,而這些引用變量可以是不同的類型。
下面的代碼中,S類繼承P類,pp和ss分別是P類型和S類型的兩個數組變量名。
[java]
public class TestPolyMorphism {
public static class P{
public void print(String message){
System.out.println("P-->"+message);
}
}
public static class S extends P{
public void print(String message){
System.out.println("S-->"+message);
}
}
public static void main(String[] args){
S[] ss = new S[10];
P[] pp = ss;
ss[0] = new S();
pp[0].print("你好");
// !!運行時錯誤,不能將父類對象,賦給子類數組;
//pp[1] = new P();//java.lang.ArrayStoreException
}
}
在內存中,pp和ss都指向了同樣的內存地址。(我們可以說,指針pp,指針ss;或者說pp引用,ss引用。)
西安達內培訓講師表示,pp和ss指向了同一個物理地址,在實際運行過程中,多態特性根據真實的對象類型決定調用父類還是子類的具體方法,而不是根據引用變量的類型。
Java如何處理引用別名機制
如果將下列代碼拷貝到eclipse中,將不會有什麼編譯期錯誤:
[java]
package think;
public class TestPolyMorphism {
public static class P{
public void print(String message){
System.out.println("P-->"+message);
}
}
public static class S extends P{
public void print(String message){
System.out.println("S-->"+message);
}
public void paint(String message){
System.out.println("S-->執行一些繪畫操作-->"+message);
}
}
public static void main(String[] args){
S[] arr = new S[10];
P[] pp = arr;
arr[0] = new S();
pp[0].print("你好");
pp[1] = new P();// !!運行時錯誤,不能將父類對象,賦給子類數組;java.lang.ArrayStoreException
}
}
但在運行期將會顯示如下錯誤:
[plain]
Exception in thread "main" java.lang.ArrayStoreException:think.TestPolyMorphism$P
atthink.TestPolyMorphism.main(TestPolyMorphism.java:22)
原因是Java在運行時才處理別名引用,在程序運行過程中,虛擬機發現數組pp的第一個元素是SS類型的對象,而不是PP類型的。
因此,只有修改為正確的代碼,才可以正常運行:
[java]
S[] arr = new S[10];
P[] pp = arr;
pp[1] = new S();
pp[1].print("你好");
輸出沒有錯誤:
[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
S-->你好