這個問題在這里已經有了答案: 繼承中的 ArrayStoreException 4 個答案 5 天前關閉。
例如,父類是Animal,而Dog 類擴展了Animal。
Animal[] arr = new Dog[5]; // This code runs without error.
arr[0] = new Dog(); // This also runs.
arr[1] = new Animal(); // This throws an exception.
為什么宣告陣列時可以有兩個不同的類?這樣做有什么用嗎?如果我實體化的類是唯一可以進入陣列的類,為什么我什至必須宣告該類?我可以將所有陣列宣告為Object[] arr嗎?
uj5u.com熱心網友回復:
Animal[] arr = new Dog[5]; // This code runs without error.
在這里,您正在創建一個陣列Dog并將其存盤在一個型別的變數中Animal[]- 這是有效的,因為Dog它是Animal. 陣列的型別仍然是Dog[]:它只是通過型別變數訪問Animal[]- 這很糟糕,你不應該這樣做!
arr[0] = new Dog(); // This also runs.
有效分配Dog到 的陣列中Dog。
arr[1] = new Animal(); // This throws an exception.
無效,因為arr是型別Dog并且將父類分配給子類是無效的
uj5u.com熱心網友回復:
1、為什么宣告陣列的時候可以有兩個不同的類?
這就是繼承的本質,您應該將 Dog 擴展 Animal 視為,Dog 類的實體化的每個物件都擴展了 Animal 類,因為它也是一個 Animal。
邏輯與 Animal 類中的方法和 Dog 類能夠訪問它的方法相同。
2.這樣做有什么用嗎?
您可以想到的一個基本用例是靈活性,例如:
public static void printAnimals(List<Animal> animals) {
animals.forEach(System.out::println);
}
...main(...) {
// this list can be made of dogs and cats
List<Animal> animals = List.of(new Dog(), new Cat());
printAnimals(animals);
}
3. 我可以將所有陣列宣告為 Object[] arr 嗎?
Java 中的每個類都擴展了 Object,所以如果你創建一個 Object 型別的陣列,這意味著你創建的任何類都可以進入這個陣列,想象在上面的例子中你想列印你的動物并且你宣告你的陣列/串列為 Object 型別,您可以將 Human 物件傳遞給它,這沒有任何意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446641.html
上一篇:抽象/靜態類的類實體化和變數共享
下一篇:僅從Python中的父類繼承型別
