![](/img/trans.png)
[英]Why can a variable of type Object hold a reference to an array in 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.