百度百科對語法糖的定義
語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語,指計算機語言中添加的某種語法,這種語法對語言的功能並沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。
Java中的語法糖也是新增了一些語法,使得程序員使用更加方便。但是計算機底層還是使用基本語法來實現的。下面我們討論幾個經常使用到的語法糖,可變參數、自動裝箱/拆箱、增強for循環。
可變參數
沒有可變參數時,我們使用同樣功能的方法需要對該方法進行重載。將會有大量的重復代碼,違反DRY(Don't repeat yourself)原則。但是有了可變參數我們可以傳入不同個數的參數,調用同一個方法。
源代碼:
public class VarialbeArgumentsDemo { public static void doWork(int... a) {//可變參數 System.out.println("同一個功能!"); } public static void main(String[] args) { doWork(1); doWork(1,2,3);//不同個數的參數,調用的同一個方法 } }
輸出結果:
同一個功能!
同一個功能!
將該文件的字節碼反編譯得到的代碼:
public class VarialbeArgumentsDemo{ public static void doWork(int... a) { System.out.println("������������"); } public static void main(String[] args){ doWork( new int[] { 1 }); doWork(new int[] { 1, 2, 3 });//計算機底層用數組來實現,可變參數的傳遞 } }
我們發現可變參數的實質就是數組傳參。
自動裝箱\拆箱
Java中有8種基本數據類型,它們不是對象。所以沒有對應的方法,無法區分‘0’和‘NULL’,操作起來不方便,所以Java將它們封裝成對象Byte、Short、Integer、Long、 Character、Float、Double、Boolean,並給出相應的方法。我們把一個基本數據類型賦給封裝類對象,需要進行類型轉換,而把一個封裝類對象賦給一個基本數據類型需要解析。我們把這兩個過程分別稱為,裝箱和拆箱。
由於這兩個操作經常要使用,裝/拆操作繁瑣而沒有難度,所以Java就給出了自動裝/拆箱操作,我們用Integer討論,其它的7種一樣。
源代碼:
public class Test { public static void main(String[] args) { Integer num1 = 123;//將一個基本數據類型賦給Integer對象 int num2 = num1;//將一個Integer對象賦給整形變量 } }
將該文件的字節碼反編譯得到的代碼:
public class Test{ public static void main(String[] args) { Integer num1 = Integer.valueOf(123);//裝箱操作 int num2 = num1.intValue();//拆箱操作 } }
計算機底層依然是手動裝箱拆箱。
增強for循環
增強for循環(foreach),讓我們對數組和Iterator實例便利更加方便。語法格式:for(數據類型 類型名 : 數組名/Iterator實例名){}
我們用增強for循環對整型數組進行遍歷。
源代碼:
public class Test { public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5}; for (int ele : arr) {//對arr進行遍歷輸出 System.out.print(ele); } } }
將該文件的字節碼反編譯得到的代碼:
public class Test { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; int[] arrayOfInt1; int j = (arrayOfInt1 = arr).length;//將原來的數組拷貝一份,防止破壞原有數據 for (int i = 0; i < j; i++) { int ele = arrayOfInt1[i]; System.out.print(ele); } } }
增強for循環在底層依舊使用的for循環
============================================
語法糖就是為了讓某些固定格式的操作簡化,程序員更方便,從而實現高效編程。
Java中的語法糖還有很多條件編譯、內部類、枚舉類、泛型等等。