JAVA語法糖原理你知道嗎
Java語法糖
幾乎所有的編程語言都或多或少提供過一些語法糖來方便程序員的代碼開發(fā),這些語法糖雖然不會提供實質(zhì)性的功能改進,但是它們或能提高效率,或能提升語法的嚴謹性,或能減少編碼出錯的機會。
1.基本概念
1.1語法糖
語法糖(Syntactic Sugar),也稱糖衣語法,是由英國計算機學家 Peter.J.Landin 發(fā)明的一個術語,指在計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。簡而言之,語法糖讓程序更加簡潔,有更高的可讀性。
1.2解語法糖
解語法糖
前面提到過,語法糖的存在主要是方便開發(fā)人員使用。但其實,Java虛擬機并不支持這些語法糖。這些語法糖在編譯階段就會被還原成簡單的基礎語法結構,這個過程就是解語法糖。Java語言中,javac命令可以將后綴名為.java的源文件編譯為后綴名為.class的可以運行于Java虛擬機的字節(jié)碼。
如果你去看com.sun.tools.javac.main.JavaCompiler的源碼,你會發(fā)現(xiàn)在compile()中有一個步驟就是調(diào)用desugar(),這個方法就是負責解語法糖的實現(xiàn)的。
~~此處需要javac的源碼
2.常見糖塊
2.1 switch 支持 String 與枚舉
都知道,Java中的swith自身原本就支持基本類型。比如int、char等。對于int類型,直接進行數(shù)值的比較。對于char類型則是比較其ascii碼。所以,對于編譯器來說,switch中其實只能使用整型,任何類型的比較都要轉(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)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WimrXrjl-1630397914057)(C:\Users\CoolGuy\AppData\Roaming\Typora\typora-user-images\image-20210831135124051.png)]](http://img.jbzj.com/file_images/article/202109/2021090110134810.png)
2.2泛型
通常情況下,一個編譯器處理泛型有兩種方式:Code specialization和Code sharing。C++和C#是使用Code specialization的處理機制,而Java使用的是Code sharing的機制。
2.3自動裝箱與拆箱
自動裝箱就是Java自動將原始類型值轉(zhuǎn)換成對應的對象,比如將int的變量轉(zhuǎn)換成Integer對象,這個過程叫做裝箱,反之將Integer對象轉(zhuǎn)換成int類型值,這個過程叫做拆箱。因為這里的裝箱和拆箱是自動進行的非人為轉(zhuǎn)換,所以就稱作為自動裝箱和拆箱。

演示代碼:
public static void main(String[] args) {
Integer a=1;//自動裝箱
int b=a;//自動拆箱
}
解析:

可以看到,自動拆箱與裝箱分別封裝了Integer中的intValue()與valueOf()方法。
2.4方法變長參數(shù)
可變參數(shù)(variable arguments)是在Java 1.5中引入的一個特性。它允許一個方法把任意數(shù)量的值作為參數(shù)。常見的就是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]);
}
}
從反編譯后代碼可以看出,可變參數(shù)在被使用的時候,他首先會創(chuàng)建一個數(shù)組,數(shù)組的長度就是調(diào)用該方法是傳遞的實參的個數(shù),然后再把參數(shù)值全部放到這個數(shù)組當中,然后再把這個數(shù)組作為參數(shù)傳遞到被調(diào)用的方法中。
**注:**String…是java5新加入的功能,表示的是一個可變長度的參數(shù)列表。
2.5枚舉
Java 枚舉是一個特殊的類,一般表示一組常量,比如一年的 4 個季節(jié),一個年的 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來定義一個枚舉類型的時候,編譯器會自動幫我們創(chuàng)建一個final類型的類繼承Enum類,所以枚舉類型不能被繼承。
2.6條件編譯
Java語法的條件編譯,是通過判斷條件為常量的if語句實現(xiàn)的。根據(jù)if判斷條件的真假,編譯器直接把分支為false的代碼塊消除。通過該方式實現(xiàn)的條件編譯,必須在方法體內(nèi)實現(xiàn),而無法在正整個Java類的結構或者類的屬性上進行條件編譯。
2.7 for : each循環(huán)
for:each循環(huán)比for循環(huán)的代碼量要少很多,但實際上就是使用了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文件路徑
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
Springboot使用POI實現(xiàn)導出Excel文件示例
本篇文章主要介紹了Springboot使用POI實現(xiàn)導出Excel文件示例,非常具有實用價值,需要的朋友可以參考下。2017-02-02
Java實現(xiàn)上傳網(wǎng)絡圖片到七牛云存儲詳解
這篇文章主要為大家詳細介紹了Java如何實現(xiàn)上傳網(wǎng)絡圖片到七牛云存儲,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下2022-12-12

