java數(shù)組、泛型、集合在多態(tài)中的使用及對(duì)比
我們?cè)谑褂脭?shù)組,泛型集合的過程中不可避免的會(huì)碰到多態(tài),或者說什么情況下能如何使用父數(shù)組引用子數(shù)組(集合、泛型)呢?
數(shù)組在多態(tài)中的使用
元素為父類型的數(shù)組引用可指向元素為子類型的數(shù)組對(duì)象
當(dāng)數(shù)組被調(diào)用時(shí)由當(dāng)前引用確定數(shù)組元素的類型
當(dāng)元素為父類型的數(shù)組引用指向了元素為子類型的數(shù)組對(duì)象時(shí),不可通過父類型的數(shù)組引用向集合加入除子類型及其下層級(jí)的之外的元素(可通過編譯,運(yùn)行過程出錯(cuò))
/*驗(yàn)證:
*animals和dogs可以引用同一個(gè)數(shù)組
*當(dāng)animals引用數(shù)組時(shí),數(shù)組元素為Animal類型
*當(dāng)dogs引用數(shù)組時(shí),數(shù)組元素為Dog類型
*/
public class Animal{
private void showClass(){
System.out.println("數(shù)組元素為Animal類型");
}
public static void main(String[] args){
//animals和dogs可以引用同一個(gè)數(shù)組
Dog[] dogs = {new Dog(), new Dog()};
Animal[] animals = dogs;
//當(dāng)animals引用數(shù)組時(shí),數(shù)組元素為Animal類型
animals[0].showClass();
//當(dāng)dogs引用數(shù)組時(shí),數(shù)組元素為Dog類型
dogs[0].showClass();
//不可通過父類型的數(shù)組引用向集合加入除子類型及其下層級(jí)的之外的元素(可通過編譯,運(yùn)行過程出錯(cuò))
animals[0] = new Animal();
}
}
class Dog extends Animal{
public void showClass(){
System.out.println("數(shù)組元素為Dog類型");
}
}
泛型在多態(tài)中的使用
ArrayList<父類型>無法引用ArrayList<子類型>
/*驗(yàn)證:
*animals無法引用dogs數(shù)組
*
*/
import java.util.*;
public class Animal{
public static void main(String[] args){
//animals無法引用dogs數(shù)組
ArrayList<Dog> dogs = new ArrayList<Dog>();
ArrayList<Animal> animals = dogs; /* 無法通過編譯 */
}
}
class Dog extends Animal{
}
為了彌補(bǔ)泛型的缺陷,java引入了一種“萬用字符”——ArrayList<? extends object>
此類型集合可引用任何參數(shù)上繼承、實(shí)現(xiàn)了參數(shù)類型(包括參數(shù)類型本身)的集合
/*萬用字符
*animals可以引用dogs集合
*當(dāng)animals引用集合時(shí),集合元素為Dog類型
*當(dāng)dogs引用集合時(shí),集合元素為Dog類型
*無法通過animals對(duì)集合進(jìn)行修改
*/
import java.util.*;
public class Animal{
public void showClass(){
System.out.println("集合元素為Animal類型");
}
public static void main(String[] args){
//animals可以引用dogs數(shù)組
ArrayList<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Dog());
ArrayList<? extends Animal> animals = dogs;
//當(dāng)animals引用集合時(shí),集合元素為Dog類型
animals.get(0).showClass();
//當(dāng)dogs引用集合時(shí),集合元素為Dog類型
dogs.get(0).showClass();
//無法通過animals對(duì)集合進(jìn)行修改(無法通過編譯)
//animals.add(new Dog());
}
}
class Dog extends Animal{
public void showClass(){
System.out.println("集合元素為Dog類型");
}
}
集合在多態(tài)中的使用
當(dāng)然List<object>集合可引用ArrayList<object>集合
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Java多維數(shù)組和Arrays類方法總結(jié)詳解
這篇文章主要介紹了Java多維數(shù)組和Arrays類方法總結(jié)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Spring @Primary和@Qualifier注解原理解析
這篇文章主要介紹了Spring @Primary和@Qualifier注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
如何在SpringBoot項(xiàng)目里進(jìn)行統(tǒng)一異常處理
這篇文章主要介紹了如何在SpringBoot項(xiàng)目里進(jìn)行統(tǒng)一異常處理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值。需要的小伙伴可以參考一下2022-07-07
Java二維數(shù)組查找功能代碼實(shí)現(xiàn)
這篇文章主要介紹了Java二維數(shù)組查找功能代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

