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

JAVA語(yǔ)法糖原理你知道嗎

 更新時(shí)間:2021年09月01日 10:22:20   作者:高冷小伙  
語(yǔ)法糖(Syntactic sugar),也叫做糖衣語(yǔ)法,是英國(guó)科學(xué)家發(fā)明的一個(gè)術(shù)語(yǔ),通常來(lái)說(shuō)使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會(huì).這篇文章主要介紹了Java 中的語(yǔ)法糖知識(shí),需要的朋友可以參考下

Java語(yǔ)法糖

​ 幾乎所有的編程語(yǔ)言都或多或少提供過(guò)一些語(yǔ)法糖來(lái)方便程序員的代碼開(kāi)發(fā),這些語(yǔ)法糖雖然不會(huì)提供實(shí)質(zhì)性的功能改進(jìn),但是它們或能提高效率,或能提升語(yǔ)法的嚴(yán)謹(jǐn)性,或能減少編碼出錯(cuò)的機(jī)會(huì)。

1.基本概念

1.1語(yǔ)法糖

​ 語(yǔ)法糖(Syntactic Sugar),也稱糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)學(xué)家 Peter.J.Landin 發(fā)明的一個(gè)術(shù)語(yǔ),指在計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。簡(jiǎn)而言之,語(yǔ)法糖讓程序更加簡(jiǎn)潔,有更高的可讀性。

1.2解語(yǔ)法糖

解語(yǔ)法糖

​前面提到過(guò),語(yǔ)法糖的存在主要是方便開(kāi)發(fā)人員使用。但其實(shí),Java虛擬機(jī)并不支持這些語(yǔ)法糖。這些語(yǔ)法糖在編譯階段就會(huì)被還原成簡(jiǎn)單的基礎(chǔ)語(yǔ)法結(jié)構(gòu),這個(gè)過(guò)程就是解語(yǔ)法糖。Java語(yǔ)言中,javac命令可以將后綴名為.java的源文件編譯為后綴名為.class的可以運(yùn)行于Java虛擬機(jī)的字節(jié)碼。

​ 如果你去看com.sun.tools.javac.main.JavaCompiler的源碼,你會(huì)發(fā)現(xiàn)在compile()中有一個(gè)步驟就是調(diào)用desugar(),這個(gè)方法就是負(fù)責(zé)解語(yǔ)法糖的實(shí)現(xiàn)的。

~~此處需要javac的源碼

2.常見(jiàn)糖塊

2.1 switch 支持 String 與枚舉

​ 都知道,Java中的swith自身原本就支持基本類型。比如int、char等。對(duì)于int類型,直接進(jìn)行數(shù)值的比較。對(duì)于char類型則是比較其ascii碼。所以,對(duì)于編譯器來(lái)說(shuō),switch中其實(shí)只能使用整型,任何類型的比較都要轉(zhuǎn)換成整型。比如byte。short,char(ackii碼是整型)以及int。

演示代碼:

public static void main(String[] args) {

    }
//    @Test
    public void Test1(){
//        Scanner scanner=new Scanner(System.in);
//        String next = scanner.next();
        String next="小高";
        switch (next){
            case "小高":
                System.out.println("我是小高");
                break;
            case "大高":
                System.out.println("我最美");
                break;
        }
    }

解釋:

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

2.2泛型

​ 通常情況下,一個(gè)編譯器處理泛型有兩種方式:Code specialization和Code sharing。C++和C#是使用Code specialization的處理機(jī)制,而Java使用的是Code sharing的機(jī)制。

2.3自動(dòng)裝箱與拆箱

​ 自動(dòng)裝箱就是Java自動(dòng)將原始類型值轉(zhuǎn)換成對(duì)應(yīng)的對(duì)象,比如將int的變量轉(zhuǎn)換成Integer對(duì)象,這個(gè)過(guò)程叫做裝箱,反之將Integer對(duì)象轉(zhuǎn)換成int類型值,這個(gè)過(guò)程叫做拆箱。因?yàn)檫@里的裝箱和拆箱是自動(dòng)進(jìn)行的非人為轉(zhuǎn)換,所以就稱作為自動(dòng)裝箱和拆箱。

在這里插入圖片描述

演示代碼:

public static void main(String[] args) {
        Integer a=1;//自動(dòng)裝箱
        int b=a;//自動(dòng)拆箱
    }

解析:

在這里插入圖片描述

可以看到,自動(dòng)拆箱與裝箱分別封裝了Integer中的intValue()與valueOf()方法。

2.4方法變長(zhǎng)參數(shù)

​ 可變參數(shù)(variable arguments)是在Java 1.5中引入的一個(gè)特性。它允許一個(gè)方法把任意數(shù)量的值作為參數(shù)。常見(jiàn)的就是printf()方法。

 public static void main(String[] args)
    {
        print("高冷", "公眾號(hào):高冷小伙", "博客:高冷小伙");
    }

    public static void print(String... strs)
    {
        for (int i = 0; i < strs.length; i++)
        {
            System.out.println(strs[i]);
        }
    }

從反編譯后代碼可以看出,可變參數(shù)在被使用的時(shí)候,他首先會(huì)創(chuàng)建一個(gè)數(shù)組,數(shù)組的長(zhǎng)度就是調(diào)用該方法是傳遞的實(shí)參的個(gè)數(shù),然后再把參數(shù)值全部放到這個(gè)數(shù)組當(dāng)中,然后再把這個(gè)數(shù)組作為參數(shù)傳遞到被調(diào)用的方法中。

**注:**String…是java5新加入的功能,表示的是一個(gè)可變長(zhǎng)度的參數(shù)列表。

2.5枚舉

​ Java 枚舉是一個(gè)特殊的類,一般表示一組常量,比如一年的 4 個(gè)季節(jié),一個(gè)年的 12 個(gè)月份,一個(gè)星期的 7 天,方向有東南西北等。Java 枚舉類使用 enum 關(guān)鍵字來(lái)定義,各個(gè)常量使用逗號(hào) , 來(lái)分割。例如定義一個(gè)顏色的枚舉類。

演示代碼:

public enum t { 
    SPRING,SUMMER; 
} 

反編譯后的代碼:

public final class T extends Enum 
{ 
    private T(String s, int i) 
    { 
        super(s, i); 
    } 
    public static T[] values() 
    { 
        T at[]; 
        int i; 
        T at1[]; 
        System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i); 
        return at1; 
    } 
 
    public static T valueOf(String s) 
    { 
        return (T)Enum.valueOf(demo/T, s); 
    } 
 
    public static final T SPRING; 
    public static final T SUMMER; 
    private static final T ENUM$VALUES[]; 
    static 
    { 
        SPRING = new T("SPRING", 0); 
        SUMMER = new T("SUMMER", 1); 
        ENUM$VALUES = (new T[] { 
            SPRING, SUMMER 
        }); 
    } 
} 

通過(guò)反編譯后代碼我們可以看到,public final class T extends Enum,說(shuō)明,該類是繼承了Enum類的,同時(shí)final關(guān)鍵字告訴我們,這個(gè)類也是不能被繼承的。

當(dāng)我們使用enmu來(lái)定義一個(gè)枚舉類型的時(shí)候,編譯器會(huì)自動(dòng)幫我們創(chuàng)建一個(gè)final類型的類繼承Enum類,所以枚舉類型不能被繼承。

2.6條件編譯

​ Java語(yǔ)法的條件編譯,是通過(guò)判斷條件為常量的if語(yǔ)句實(shí)現(xiàn)的。根據(jù)if判斷條件的真假,編譯器直接把分支為false的代碼塊消除。通過(guò)該方式實(shí)現(xiàn)的條件編譯,必須在方法體內(nèi)實(shí)現(xiàn),而無(wú)法在正整個(gè)Java類的結(jié)構(gòu)或者類的屬性上進(jìn)行條件編譯。

2.7 for : each循環(huán)

for:each循環(huán)比f(wàn)or循環(huán)的代碼量要少很多,但實(shí)際上就是使用了For循環(huán)和迭代器。

演示代碼:

 public static void main(String[] args) {
        String[] strs={"高效","高冷","高超","高速"};
        for(String str:strs){
            System.out.println(str);
        }
    }

解析:

public static void main(String[] args) {
    String[] strs = new String[]{"高效", "高冷", "高超", "高速"};
    String[] var2 = strs;
    int var3 = strs.length;

    for(int var4 = 0; var4 < var3; ++var4) {
        String str = var2[var4];
        System.out.println(str);
    }

}

3.最后

3.1Java編譯與反編譯

java cp D:\JVM_Study\src\SyntacticSugar\SwitchDemo.java
參數(shù)是cp,路徑是.java文件的路徑
    
javap -c D:\JVM_Study\out\production\JVM_Study\SyntacticSugar\SwitchDemo.class
參數(shù)是c
路徑是的.class文件路徑
3.1Java編譯與反編譯

~~~java
java cp D:\JVM_Study\src\SyntacticSugar\SwitchDemo.java
參數(shù)是cp,路徑是.java文件的路徑
    
javap -c D:\JVM_Study\out\production\JVM_Study\SyntacticSugar\SwitchDemo.class
參數(shù)是c
路徑是的.class文件路徑

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java在枚舉類型中增加自定義方法詳解

    Java在枚舉類型中增加自定義方法詳解

    這篇文章主要介紹了Java在枚舉類型中增加自定義方法詳解,對(duì)于枚舉類型來(lái)說(shuō),除了無(wú)法繼承它以外,基本可以將它看作一個(gè)普通的類,這意味著你可以在里面增加自定義的方法,甚至可以增加一個(gè) main() 方法,需要的朋友可以參考下
    2023-11-11
  • 使用Java實(shí)現(xiàn)Redis限流的方法

    使用Java實(shí)現(xiàn)Redis限流的方法

    限流的作用是防止某個(gè)段時(shí)間段內(nèi)的請(qǐng)求數(shù)過(guò)多,造成模塊因高并發(fā)而不可用。這篇文章給大家介紹使用Java實(shí)現(xiàn)Redis限流的相關(guān)知識(shí),一起看看吧
    2021-09-09
  • 教你springboot+dubbo快速啟動(dòng)的方法

    教你springboot+dubbo快速啟動(dòng)的方法

    這篇文章主要介紹了springboot+dubbo快速啟動(dòng)的方法,dubbo的角色廣泛的分為三類provider,comsumer,注冊(cè)中心,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下
    2022-04-04
  • IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件的圖文教程

    IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件的圖文教程

    這篇文章主要介紹了IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • zuul過(guò)濾器中轉(zhuǎn)發(fā)請(qǐng)求頭的解決方案

    zuul過(guò)濾器中轉(zhuǎn)發(fā)請(qǐng)求頭的解決方案

    這篇文章主要介紹了zuul過(guò)濾器中轉(zhuǎn)發(fā)請(qǐng)求頭的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java清除html轉(zhuǎn)義字符

    java清除html轉(zhuǎn)義字符

    這篇文章主要介紹了一個(gè)靜態(tài)文件處理的一些便捷服務(wù),包括 java清除html轉(zhuǎn)義字符,清除html代碼,從style樣式中讀取CSS的屬性,將字符串截取指定長(zhǎng)度,涉及l(fā)og4j,common-lang類的學(xué)習(xí)
    2014-01-01
  • java輕量級(jí)規(guī)則引擎easy-rules使用介紹

    java輕量級(jí)規(guī)則引擎easy-rules使用介紹

    這篇文章主要介紹了java輕量級(jí)規(guī)則引擎easy-rules使用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java面試突擊之sleep和wait有什么區(qū)別詳析

    java面試突擊之sleep和wait有什么區(qū)別詳析

    按理來(lái)說(shuō)sleep和wait本身就是八竿子打不著的兩個(gè)東西,但是在實(shí)際使用中大家都喜歡拿他們來(lái)做比較,或許是因?yàn)樗鼈兌伎梢宰尵€程處于阻塞狀態(tài),這篇文章主要給大家介紹了關(guān)于java面試突擊之sleep和wait有什么區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • java實(shí)現(xiàn)單詞搜索迷宮游戲

    java實(shí)現(xiàn)單詞搜索迷宮游戲

    這篇文章主要介紹了java實(shí)現(xiàn)單詞搜索迷宮游戲,實(shí)例分析了迷宮游戲的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信(TCP通信、UDP通信、多播以及NIO)總結(jié)

    java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信(TCP通信、UDP通信、多播以及NIO)總結(jié)

    這篇文章主要介紹了java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信總結(jié)的相關(guān)資料,包括TCP通信、UDP通信、多播以及NIO,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

武夷山市| 景洪市| 江城| 扶风县| 南阳市| 蒙阴县| 辛集市| 珲春市| 历史| 义马市| 南涧| 河池市| 克什克腾旗| 阿瓦提县| 康定县| 辰溪县| 蓝山县| 拉萨市| 武陟县| 慈利县| 图木舒克市| 元谋县| 隆回县| 德昌县| 甘谷县| 汶上县| 牟定县| 宜丰县| 专栏| 南汇区| 湾仔区| 丹棱县| 井陉县| 沛县| 高淳县| 苍南县| 罗平县| 额济纳旗| 彭阳县| 龙川县| 聂荣县|