Java的引用別名機制講的是什麼??

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-->你好

相關問題答案