標籤:string 簡化 類對象 iter yourself 等等 數組傳參 nta ati
百度百科對文法糖的定義
文法糖(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種基礎資料型別 (Elementary Data Type),它們不是對象。所以沒有對應的方法,無法區分‘0’和‘NULL’,操作起來不方便,所以Java將它們封裝成對象Byte、Short、Integer、Long、 Character、Float、Double、Boolean,並給出相應的方法。我們把一個基礎資料型別 (Elementary Data Type)賦給封裝類對象,需要進行類型轉換,而把一個封裝類對象賦給一個基礎資料型別 (Elementary Data Type)需要解析。我們把這兩個過程分別稱為,裝箱和拆箱。
由於這兩個操作經常要使用,裝/拆操作繁瑣而沒有難度,所以Java就給出了自動裝/拆箱操作,我們用Integer討論,其它的7種一樣。
原始碼:
public class Test { public static void main(String[] args) { Integer num1 = 123;//將一個基礎資料型別 (Elementary Data Type)賦給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中的文法糖還有很多條件編譯、內部類、枚舉類、泛型等等。
Java 中的文法糖