一、了解一下javac編譯的詳解過程
(1)詞法、語法分析
(2)符號填充表(目前這點知識我不是很理解)
(3)注解處理器
(4)語義分析與字節碼生成
a) 標注檢查
int a = 1; boolean b = false; char c = 2;
int d = a + c; int d = b + c; char d = a + c;
b) 數據及控制流分析
c) 語法糖
(4)字節碼生成
二、Java語法糖的味道
語法糖雖然不會提供實質性的功能改進,但是它們或能提供效率,或能提升語法的嚴謹性,或能減少編碼出錯的機會。但是大量添加和使用“含糖”的語法,容易讓程序員產生依賴,無法看清程序代碼的真實面目。
(1)泛型與類型擦除
泛型早期在Java語言中沒有出現時,只能通過Object是所有類型的父類和類型強制轉換兩個特點的配合來實現類型轉化。例如:在哈希表的存取中,1.5之前使用HashMap的get()方法,返回值就是一個Object對象,由於Java語言里面所有的類型都繼承於java.lang.Object,所以Object轉型成任何對象都是有可能的。但是因為有無限可能性,許多ClassCastException的風險就會轉嫁到程序的運行期間。
泛型重載(編譯不通過)
public class GenericType{ public static void method(List<String> list){ System.out.print("invoke method(List<String> list)"); } public static void method(List<Integer> list){ System.out.print("invoke method(List<Integer> list)"); } }
編譯不通過,泛型在編譯階段進行擦除,變成原生類型List<E>,擦除 動作導致這兩種方法的特征簽名變得一模一樣。
(2)自動裝箱、拆箱與遍歷循環
源代碼:
public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4); //如果在JDK 1.7中,還有另外一種語法糖 //能讓上面這句話進一步簡寫成List<Integer> list = [1, 2, 3, 4] int sum = 0; for (Integer i : list) { sum += i; } System.out.println(sum); }
編譯后的代碼:
public static void main(String[] args) { List<Integer> list = Arrays.asList(new Integer[]{ Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4) }); int sum = 0; for (Iterator localIterator = list.iterator();localIterator.hasNext();){ int i = ((Integer) localIterator.next()).intValue(); sum += i; } System.out.println(sum); }
裝箱:基本類型變為包裝類型,例如:Integer n = 1;
拆箱:包裝類型變為基本類型,例如:int i = n;
重點:包裝類重新賦值會創建新的對象,因為每一個包裝類型中value都被final修飾的!例如Integer類中:private final int value;
(3) 條件編譯
源代碼:
public static void main(String[] args) { if (true) { System.out.println("block 1"); } else { System.out.println("block 2"); } }
編譯后的代碼:
public static void main(String[] args) { System.out.println("block 1"); }
只能使用條件為常量的if語句才能達到上述效果,編譯器將會把分支中不成立的代碼塊消除掉,這一過程在編譯階段完成!
重點理解:在前端編譯器中,“優化”手段主要用於提升程序的編碼效率,之所以把Javac這類將Java代碼轉變為字節碼的編譯器稱做“前端編譯器”,是因為它只完成了從程序到抽象語法樹或中間代碼的生成,而在此之后,還有一組內置於虛擬機內部的“后端編譯器”完成從字節碼生成本地機器碼的過程,就是即時編譯器或JIT編譯器,這個編譯器的編譯速度及編譯結果的優劣,是衡量虛擬機性能一個很重要的指標!