一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JAVA語法糖原理你知道嗎

JAVA語法糖原理你知道嗎

2021-12-13 13:34高冷小伙 Java教程

語法糖(Syntactic sugar),也叫做糖衣語法,是英國科學家發明的一個術語,通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會.這篇文章主要介紹了Java 中的語法糖知識,需要的朋友可以參考下

Java語法糖

? 幾乎所有的編程語言都或多或少提供過一些語法糖來方便程序員的代碼開發,這些語法糖雖然不會提供實質性的功能改進,但是它們或能提高效率,或能提升語法的嚴謹性,或能減少編碼出錯的機會。

 

1.基本概念

1.1語法糖

? 語法糖(Syntactic Sugar),也稱糖衣語法,是由英國計算機學家 Peter.J.Landin 發明的一個術語,指在計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。簡而言之,語法糖讓程序更加簡潔,有更高的可讀性。

1.2解語法糖

解語法糖

?前面提到過,語法糖的存在主要是方便開發人員使用。但其實,Java虛擬機并不支持這些語法糖。這些語法糖在編譯階段就會被還原成簡單的基礎語法結構,這個過程就是解語法糖。Java語言中,javac命令可以將后綴名為.java的源文件編譯為后綴名為.class的可以運行于Java虛擬機的字節碼。

? 如果你去看com.sun.tools.javac.main.JavaCompiler的源碼,你會發現在compile()中有一個步驟就是調用desugar(),這個方法就是負責解語法糖的實現的。

~~此處需要javac的源碼

 

2.常見糖塊

2.1 switch 支持 String 與枚舉

? 都知道,Java中的swith自身原本就支持基本類型。比如int、char等。對于int類型,直接進行數值的比較。對于char類型則是比較其ascii碼。所以,對于編譯器來說,switch中其實只能使用整型,任何類型的比較都要轉換成整型。比如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;
      }
  }

解釋:

JAVA語法糖原理你知道嗎

2.2泛型

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

2.3自動裝箱與拆箱

? 自動裝箱就是Java自動將原始類型值轉換成對應的對象,比如將int的變量轉換成Integer對象,這個過程叫做裝箱,反之將Integer對象轉換成int類型值,這個過程叫做拆箱。因為這里的裝箱和拆箱是自動進行的非人為轉換,所以就稱作為自動裝箱和拆箱。

JAVA語法糖原理你知道嗎

演示代碼:

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

解析:

JAVA語法糖原理你知道嗎

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

2.4方法變長參數

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

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

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

從反編譯后代碼可以看出,可變參數在被使用的時候,他首先會創建一個數組,數組的長度就是調用該方法是傳遞的實參的個數,然后再把參數值全部放到這個數組當中,然后再把這個數組作為參數傳遞到被調用的方法中。

**注:**String…是java5新加入的功能,表示的是一個可變長度的參數列表。

2.5枚舉

? Java 枚舉是一個特殊的類,一般表示一組常量,比如一年的 4 個季節,一個年的 12 個月份,一個星期的 7 天,方向有東南西北等。Java 枚舉類使用 enum 關鍵字來定義,各個常量使用逗號,來分割。例如定義一個顏色的枚舉類。

演示代碼:

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 
      }); 
  } 
} 

通過反編譯后代碼我們可以看到,public final class T extends Enum,說明,該類是繼承了Enum類的,同時final關鍵字告訴我們,這個類也是不能被繼承的。

當我們使用enmu來定義一個枚舉類型的時候,編譯器會自動幫我們創建一個final類型的類繼承Enum類,所以枚舉類型不能被繼承。

2.6條件編譯

? Java語法的條件編譯,是通過判斷條件為常量的if語句實現的。根據if判斷條件的真假,編譯器直接把分支為false的代碼塊消除。通過該方式實現的條件編譯,必須在方法體內實現,而無法在正整個Java類的結構或者類的屬性上進行條件編譯。

2.7 for : each循環

for:each循環比for循環的代碼量要少很多,但實際上就是使用了For循環和迭代器。

演示代碼:

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
參數是cp,路徑是.java文件的路徑
  
javap -c D:\JVM_Study\out\production\JVM_Study\SyntacticSugar\SwitchDemo.class
參數是c
路徑是的.class文件路徑
3.1Java編譯與反編譯

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

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/alpha_xia/article/details/120020706

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 猫咪av | 盲井在线 | 国产亚洲福利一区二区免费看 | 国产精品久久国产精品99盘 | 日本tube24xxxxx | 九九影院午夜理论片无码 | 天天摸天天爽视频69视频 | 亚洲国产综合另类视频 | 免费人成在线观看69式小视频 | 亚洲精品国产一区二区第一页 | 青青草原免费在线视频 | eee在线播放成人免费 | 黑人巨大精品战中国美女 | 99r在线播放 | 国内老司机精品视频在线播出 | 四虎永久免费地址在线观看 | 韩国悲惨事件30无删减在线 | 成人18视频在线观看 | 国产精品久久久久久久久免费观看 | 四虎永久免费地址 | 五月色天在线视频综合观看 | 亚洲AV无码一区二区三区乱子伦 | 干操视频| 陈峰姚瑶全集小说无删节 | 国语自产拍在线观看7m | 黑人同学征服教师麻麻 | 学校捏奶揉下面污文h | 国产精品主播在线 | 亚洲日韩精品欧美一区二区 | 亚洲性视频在线观看 | 国产肥老上视频 | 亚洲欧美另类在线观看 | 7777奇米四色 | fquer老师 | 欧美日韩看看2015永久免费 | 911亚洲精品国内自产 | 日本视频观看 | 日韩在线免费看 | 女人把扒开给男人爽 | 香蕉免费一区二区三区在线观看 | 国产成人精品一区二区不卡 |