簡體   English   中英

為什么引用類型可以與Java中的對象類型不同

[英]why is reference type can be different from object type in java

class Animal {

}

class Horse extends Animal {

}

public class Test {
    public static void main(){
        Animal a = new Horse();//mark1
    }
}


Animal ah = new Horse();// reference type is Animal and object is Horse

我在下面無法完全理解: Animal ah = new Horse(); //引用類型為Animal,對象為Horse
我總是保持引用類型與對象相同
我想知道用未相同的參考type.Please告訴我一些情況,它是更適合使用它的原因

這在幾種情況下都有效,一個簡單的例子就是如果您需要一系列動物:

Animal array[] = new Animal[3];
array[0] = new Horse();
array[1] = new Cow();
array[2] = new Animal();

您可以定義一些通用方法,也可以為每個擴展類指定它們。

public class Cow extends Animal {
    public void sound() {
        System.out.println("MOO");
    }
}

public class Horse extends Animal {
    public void sound() {
        System.out.println("HEEEHREHE");
    }
}

在《動物》中,您不知道該怎么做,因此可以使用類似

public class Animal {
    public void sound() {
        System.out.println(".");
    }
}

問題是,如果您遍歷數組中的每個動物,它將使用為其定義的方法。

for (int i = 0; i < 3; i++) {
    array[i].sound();
}

將輸出:

HEEEHREHE
MOO
.

因此,您可以將Animal或Horse中的任何一種用作“ ab”類型。 在這種特殊情況下,按動物類型引用對象的有用之處在於,在以后的階段中,當您想讓ah指向其他動物對象說“狗”(實現了動物接口)時,在其他代碼位置您將不會需要在代碼中的其他動物類型上進行更改。 因此,通過接口類型引用對象引用可以自由地動態更改實際的實現實例,並且也將實現類隱藏在外部世界中。

除了在程序執行期間能夠使相同的變量引用不同類的對象外,通常還會使編碼選項保持打開狀態。

經典案例是:

List<String> myList = new ArrayList<String>();

編譯器將拒絕例如myList.ensureCapacity(100),因為sureCapacity不是List方法。 只有List方法可以用於myList。 如果在程序運行並經過測量之后,發現使用LinkedList可以使程序運行更快,則僅構造函數調用會更改。 myList無法完成任何List無法使用的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM