在 Java 中,當使用多個引用來引用同一個物件時,通常將其稱為「別名」。別名的問題是當使用者向特定物件及其擁有者寫入多個其他參考時,不期望該物件發生變化。在這裡,包含別名的程式碼很快就會變得混亂,而且調試起來也非常乏味。讓我們看看 Java Alias 是如何運作的。
廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
正如我們之前所討論的,當多個引用與同一物件關聯時,就會發生別名。這也意味著一個位置有多個可以修改的別名,而這些特定別名有多種類型。
讓我們舉個例子。 x 和 y 是兩個變數名,有兩種類型:X 和 Y。 Y 擴充 X。
Y[] y = new Y[10]; X[] x = y; x[0] = new X(); Y[0].func1();
在記憶中,它們都指向同一個位置。
x 和 y 所指向的記憶體位置。然而,實際保存的物件會選擇在運行時呼叫哪個方法。
讓我們來看另一個例子。
Rectangle b1 = new Rectangle (0, 0, 50, 150); Rectangle b2 = b1;
b1 和 b2 都指的是同一個對象,或者我們可以說給定的對像有兩個名稱,例如 b1 和 b2。類似人有兩個名字,物體也可以有兩個名字。
當存在兩個別名變數時,導致一個變數的變更也會反映在另一個變數上,如下所示。
System.out.println (b2.width); b1.grow (40, 40); System.out.println (b2.width);
執行程式碼時,您將看到在一個矩形上引起的變更也發生在第二個矩形上。這是 Java 中 Alias 需要注意的主要事項之一。
以下是 Java Alias 的一些範例程式。
代碼:
//class X class X { //function 1 public void func1() { System.out.println("called sample function 1"); } } //Class Y that extends the class X class Y extends X { //function 1 public void func1() { System.out.println("called sample function 1"); } //function 2 public void func2() { System.out.println("called sample function 2"); } } //main class public class AliasExample { //main method public static void main(String[] args) { Y[] y = new Y[10]; X[] x = y; x[0] = new X(); y[0].func1(); } }
輸出:
這是如何發生的?需要改變什麼?這個問題能解決嗎?
是的! !出現此異常的唯一原因是 Java 在執行時間管理別名。只有在運行時它才能知道第一個應該是 Y 的物件而不是 X。
//class X class X { //function 1 public void func1() { System.out.println("called sample function 1"); } } //Class Y that extends the class X class Y extends X { //function 1 public void func1() { System.out.println("called sample function 1"); } //function 2 public void func2() { System.out.println("called sample function 2"); } } //main class public class AliasExample { //main method public static void main(String[] args) { Y[] y = new Y[10]; X[] x = y; x[0] = new Y(); y[0].func1(); } }
輸出:
代碼:
//main class public class AliasExample { //main method public static void main(String[] args) { //create two different arrays with same value int a= 87; int b=87; //checks whether a and b are equal System.out.println(a == b); //assign b equal to a b=a; //checks whether a and b are equal System.out.println(a == b); } }
輸出:
如果使用兩個陣列 a 和 b 來取代整數變數會發生什麼事?
//main class public class AliasExample { //main method public static void main(String[] args) { //create two different arrays with same value int []a = {81, 54, 83}; int []b = {81, 54, 83}; //checks whether a and b are equal System.out.println(a == b); //assign b equal to a b=a; //checks whether a and b are equal System.out.println(a == b); } }
輸出:
在此程式中,第一步建立了兩個陣列 a 和 b。然後,與上面的程序類似,a和b檢查它們是否相等。執行程式碼時可以看到,第一次檢查的輸出為 false,第二次檢查的輸出為 true。這是因為 Java Alias 有效。
別名的缺點是當使用者寫入特定物件時,而擁有者對於其他一些引用,無法猜測該物件會發生變更。
以上是Java 別名的詳細內容。更多資訊請關注PHP中文網其他相關文章!