最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?泛型考古?泛型擦除?包裝類(lèi)詳細(xì)解析

 更新時(shí)間:2022年03月23日 10:20:58   作者:來(lái)自爪哇的bean  
泛型是在Java?SE?1.5引入的的新特性,本質(zhì)是參數(shù)化類(lèi)型,也就是說(shuō)所操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)。這種參數(shù)類(lèi)型可以用在類(lèi)、接口和方法的創(chuàng)建中,分別稱(chēng)為泛型類(lèi)、泛型接口、泛型方法,本篇我們一起來(lái)學(xué)習(xí)泛型考古、泛型擦除、包裝類(lèi)

一. 什么是泛型

泛型(generic type)其本質(zhì)是將類(lèi)型參數(shù)化,也就是說(shuō)所操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)這種參數(shù)類(lèi)型可以用在類(lèi)、接口和方法的創(chuàng)建中,分別稱(chēng)為泛型類(lèi)、泛型接口、泛型方法。

二. 為什么要有泛型 ?

之前寫(xiě)過(guò)MyArrayList順序表,這個(gè)類(lèi)當(dāng)時(shí)自己在實(shí)現(xiàn)的時(shí)候只能用一種類(lèi)型來(lái)表示,也就是用的時(shí)候自己實(shí)現(xiàn)的MyArrayList只能應(yīng)用于一種類(lèi)型,要想應(yīng)用于其他類(lèi)型,就得再寫(xiě)一個(gè)其他類(lèi)型的MyArrayList,這樣就比較麻煩,而有了泛型之后就很好的解決了這個(gè)問(wèn)題,讓類(lèi)型參數(shù)化,使得自己寫(xiě)的MyArrayList可以適用于多種場(chǎng)景

通過(guò)以下代碼對(duì)比就可發(fā)現(xiàn)泛型的方便之處

示例

不帶泛型

public class MyArrayList {
    private int[] array;
    private int size;    // 有效數(shù)據(jù)個(gè)數(shù)
    public MyArrayList() {
        this.array = new int[10];
        this.size = 0;
    }
    public void add(int x) {    // 暫不考慮擴(kuò)容
        this.array[size] = x;
        this.size++;
    }
}

帶泛型

import org.omg.CORBA.Object;

public class MyArrayList2<E> {
    // 在類(lèi)的實(shí)現(xiàn)中,可以直接將類(lèi)當(dāng)成一種數(shù)據(jù)類(lèi)型來(lái)使用。在實(shí)例化該類(lèi)的時(shí)候這個(gè)類(lèi)型才被確定
    private E[] array;
    private int size;   // 有效數(shù)據(jù)個(gè)數(shù)
    public MyArrayList2() {
        this.array = (E[])new Object[10];   // 注意:Java中泛型不允許定義數(shù)組
        this.size = 0;
    }
    public void add(E e) {    // 不考慮擴(kuò)容
        this.array[size] = e;
        this.size++;
    }
}
// 帶泛型的順序表元素類(lèi)型是一個(gè)“變量”
// E就是變量的名稱(chēng)

通過(guò)上面這兩段代碼的對(duì)比,就可以發(fā)現(xiàn),帶泛型的順序表和不帶泛型的順序表只是表示類(lèi)型的部分不一樣,代碼所實(shí)現(xiàn)的邏輯是一樣的

類(lèi)的實(shí)例化與使用

public static void main(String[] args) {
    MyArrayList myArrayList = new MyArrayList();
    myArrayList.add(1);
    myArrayList.add(2);
																	// 這里其實(shí)就相當(dāng)于是將String類(lèi)型賦值給E
    MyArrayList2<String> stringMyArrayList2 = new MyArrayList2<String>();    // 等號(hào)右邊的<>內(nèi)可以省略
    stringMyArrayList2.add("1");                                           // 要想用基本類(lèi)型,要寫(xiě)基本類(lèi)型對(duì)應(yīng)的包裝類(lèi)
    stringMyArrayList2.add("2");
}

對(duì)于泛型來(lái)說(shuō),類(lèi)型是在使用該類(lèi)時(shí)才明確定義出來(lái)的

三、泛型考古

要知道其實(shí)剛開(kāi)始Java體系中是沒(méi)有泛型的,是在JDK1.5之后才才有了泛型

在JDK1.5之前是利用Object引用可以指向任意類(lèi)型的對(duì)象實(shí)現(xiàn)類(lèi)似泛型的效果

  • Object類(lèi)是所有類(lèi)的祖先類(lèi)
  • 上層引用可以指向下層對(duì)象

如下代碼:

public class MyArrayList3 {
    private Object[] array;
    private int size;
    public MyArrayList3() {
        this.array = new Object[10];
        this.size = 0;
    }
    public void add(Object e) {
        this.array[size] = e;
        size++;
    }
}

這種做法的缺點(diǎn)也很明顯,就是new了一個(gè)MyArrayList,里面打算存int類(lèi)型的數(shù)據(jù),但由于手滑,存入了一個(gè)String類(lèi)型的數(shù)據(jù),這樣的話(huà)編譯器是不會(huì)報(bào)錯(cuò)的,程序也能正常運(yùn)行,直到需要取list中的元素的時(shí)候程序才會(huì)拋出異常。

泛型就很好的解決了這個(gè)問(wèn)題,只要類(lèi)型不匹配,錯(cuò)誤會(huì)在第一時(shí)間暴露出來(lái)

四、泛型擦除

雖然在 JDK1.5 之后有了泛型,但其實(shí)JDK的底層實(shí)現(xiàn)還是用的上面Object來(lái)實(shí)現(xiàn)的

如下圖

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sB60DwZz-1646265098596)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20211210185132787.jpg)]

我們雖然用的是泛型,但其實(shí)泛型只存在于編譯階段,在編譯過(guò)程中也伴隨著泛型擦除,在生成.class文件的時(shí)候泛型信息就已經(jīng)不存在了,成了JDK1.5之前的Object方式

查看MyArrayList的字節(jié)碼文件就可以看出來(lái)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-KCvl7iYr-1646265098598)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20220123202400988.jpg)]

所以Java的泛型只存在于編譯階段(Java核心原理:Object引用可以指向任意類(lèi)型的對(duì)象)

五、包裝類(lèi)

由于8種基本類(lèi)型不是類(lèi)類(lèi)型,Java專(zhuān)門(mén)為它們定義了各自的包裝類(lèi)

如下:

byte java.lang.Byte
short java.lang.Short
char java.lang.Character
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
boolean java.lang.Boolean

六、裝箱拆箱

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-dsPrxxd0-1646265098599)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20220212173816723.jpg)]

Java中提供了便利,如果沒(méi)有歧義,Java 會(huì)幫我們自動(dòng)裝箱,自動(dòng)拆箱

Integer a = 10;   // 把int賦值給Integer類(lèi)型,隱含著發(fā)生了裝箱過(guò)程
int b = a;      // 把Integer賦值給int類(lèi)型,隱含著發(fā)生了拆箱過(guò)程

隱式裝箱和拆箱過(guò)程只存在于編譯階段,編譯完成就變成顯式裝箱,顯式拆箱了

到此這篇關(guān)于Java 泛型考古 泛型擦除 包裝類(lèi)詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java 泛型 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA實(shí)現(xiàn)KMP算法理論和示例代碼

    JAVA實(shí)現(xiàn)KMP算法理論和示例代碼

    本文從理論到代碼講解了JAVA對(duì)KMP算法的實(shí)現(xiàn),大家可以參考一下
    2013-11-11
  • maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo

    maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo

    這篇文章主要為大家介紹了maven創(chuàng)建spark項(xiàng)目的pom.xml文件配置demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java集合Stream流操作的基本使用教程分享

    Java集合Stream流操作的基本使用教程分享

    流操作并不會(huì)影響原來(lái)的集合,可以簡(jiǎn)單認(rèn)為,流操作是把集合中的一個(gè)元素逐個(gè)復(fù)制放到一個(gè)首尾相接的流動(dòng)的水槽中。這篇文章整理了Stream流操作的基本使用,需要的可以參考一下
    2023-02-02
  • 使用Java獲取文件樹(shù)的代碼實(shí)現(xiàn)

    使用Java獲取文件樹(shù)的代碼實(shí)現(xiàn)

    Java語(yǔ)言提供了豐富的庫(kù)和工具,使得我們可以方便地獲取和操作Java文件的語(yǔ)法樹(shù)(AST, Abstract Syntax Tree),在這篇博客中,我們將探討如何使用Java來(lái)獲取一個(gè)Java文件的語(yǔ)法樹(shù),并展示詳細(xì)的代碼示例和運(yùn)行結(jié)果,需要的朋友可以參考下
    2024-08-08
  • Java替換字符串replace和replaceAll方法舉例詳解

    Java替換字符串replace和replaceAll方法舉例詳解

    這篇文章主要介紹了Java中替換字符串的幾種方法,包括String類(lèi)的replace()、replaceAll()、replaceFirst()方法,以及StringBuilder和StringBuffer類(lèi)的replace()方法,還提到了一些第三方庫(kù),如Hutool,它們提供了更豐富的字符串處理功能,需要的朋友可以參考下
    2025-02-02
  • Java實(shí)現(xiàn)五子棋游戲

    Java實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 基于Maven?pom文件中屬性變量總結(jié)

    基于Maven?pom文件中屬性變量總結(jié)

    這篇文章主要介紹了Maven?pom文件中屬性變量總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)

    Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)

    這篇文章主要給大家介紹了關(guān)于Java根據(jù)URL下載文件到本地的2種方式,分別是大型文件與小型文件,避免內(nèi)存溢出OOM,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解

    Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring框架基于注解的AOP之各種通知的使用及其環(huán)繞通知,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • java交換排序之雞尾酒排序?qū)崿F(xiàn)方法

    java交換排序之雞尾酒排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java交換排序之雞尾酒排序?qū)崿F(xiàn)方法,實(shí)例分析了排序的原理與相關(guān)的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

亳州市| 略阳县| 商河县| 连南| 安丘市| 柳林县| 富裕县| 宽城| 绵竹市| 怀远县| 新巴尔虎左旗| 顺昌县| 梨树县| 财经| 石河子市| 西充县| 寻乌县| 怀来县| 新郑市| 辽中县| 康乐县| 阳山县| 辽源市| 宜阳县| 定襄县| 光山县| 云南省| 英吉沙县| 长春市| 黎平县| 长垣县| 新巴尔虎左旗| 牡丹江市| 宁化县| 贵阳市| 建瓯市| 河南省| 湄潭县| 弥渡县| 墨竹工卡县| 博乐市|