java數(shù)組、泛型、集合在多態(tài)中的使用及對比
我們在使用數(shù)組,泛型集合的過程中不可避免的會碰到多態(tài),或者說什么情況下能如何使用父數(shù)組引用子數(shù)組(集合、泛型)呢?
數(shù)組在多態(tài)中的使用
元素為父類型的數(shù)組引用可指向元素為子類型的數(shù)組對象
當數(shù)組被調用時由當前引用確定數(shù)組元素的類型
當元素為父類型的數(shù)組引用指向了元素為子類型的數(shù)組對象時,不可通過父類型的數(shù)組引用向集合加入除子類型及其下層級的之外的元素(可通過編譯,運行過程出錯)
/*驗證:
*animals和dogs可以引用同一個數(shù)組
*當animals引用數(shù)組時,數(shù)組元素為Animal類型
*當dogs引用數(shù)組時,數(shù)組元素為Dog類型
*/
public class Animal{
private void showClass(){
System.out.println("數(shù)組元素為Animal類型");
}
public static void main(String[] args){
//animals和dogs可以引用同一個數(shù)組
Dog[] dogs = {new Dog(), new Dog()};
Animal[] animals = dogs;
//當animals引用數(shù)組時,數(shù)組元素為Animal類型
animals[0].showClass();
//當dogs引用數(shù)組時,數(shù)組元素為Dog類型
dogs[0].showClass();
//不可通過父類型的數(shù)組引用向集合加入除子類型及其下層級的之外的元素(可通過編譯,運行過程出錯)
animals[0] = new Animal();
}
}
class Dog extends Animal{
public void showClass(){
System.out.println("數(shù)組元素為Dog類型");
}
}
泛型在多態(tài)中的使用
ArrayList<父類型>無法引用ArrayList<子類型>
/*驗證:
*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{
}
為了彌補泛型的缺陷,java引入了一種“萬用字符”——ArrayList<? extends object>
此類型集合可引用任何參數(shù)上繼承、實現(xiàn)了參數(shù)類型(包括參數(shù)類型本身)的集合
/*萬用字符
*animals可以引用dogs集合
*當animals引用集合時,集合元素為Dog類型
*當dogs引用集合時,集合元素為Dog類型
*無法通過animals對集合進行修改
*/
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;
//當animals引用集合時,集合元素為Dog類型
animals.get(0).showClass();
//當dogs引用集合時,集合元素為Dog類型
dogs.get(0).showClass();
//無法通過animals對集合進行修改(無法通過編譯)
//animals.add(new Dog());
}
}
class Dog extends Animal{
public void showClass(){
System.out.println("集合元素為Dog類型");
}
}
集合在多態(tài)中的使用
當然List<object>集合可引用ArrayList<object>集合
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關文章
Struts2源碼分析之ParametersInterceptor攔截器
這篇文章主要介紹了Struts2源碼分析之ParametersInterceptor攔截器,ParametersInterceptor攔截器其主要功能是把ActionContext中的請求參數(shù)設置到ValueStack中,,需要的朋友可以參考下2019-06-06
Spring Boot整合elasticsearch的詳細步驟
這篇文章主要介紹了Spring Boot整合elasticsearch的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
SpringBoot整合Javamail實現(xiàn)郵件發(fā)送的詳細過程
日常開發(fā)過程中,我們經(jīng)常需要使用到郵件發(fā)送任務,比方說驗證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關于SpringBoot整合Javamail實現(xiàn)郵件發(fā)送的詳細過程,需要的朋友可以參考下2022-10-10
java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法
本文主要介紹了java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
Spring定時任務只執(zhí)行一次的原因分析與解決方案
在使用Spring的@Scheduled定時任務時,你是否遇到過任務只執(zhí)行一次,后續(xù)不再觸發(fā)的情況?這種情況可能由多種原因導致,如未啟用調度、線程池問題、異常中斷等,本文將深入分析Spring定時任務只執(zhí)行一次的原因,并提供完整的解決方案,需要的朋友可以參考下2025-03-03
Spring Boot報錯:No session repository could be auto-configured
這篇文章主要給大家介紹了關于Spring Boot報錯:No session repository could be auto-configured, check your configuration的解決方法,文中給出了詳細的解決方法,對遇到這個問題的朋友們具有一定參考價值,需要的朋友下面來一起看看吧。2017-07-07

