本文通過(guò)一段代碼探討一下java Final關(guān)鍵字對(duì)基本類型和對(duì)象類型的修飾差異攘宙,編譯前部分代碼:
final String hint ="Hello world!";//final compile run
final StringBuffer sb =new StringBuffer();
System.out.println(sb.append(hint));
System.out.println(sb.append(5));
System.out.println(sb);
String hr = hint;
System.out.println(hint);
System.out.println(hr);
final int a =5;
final int b =6;
int c = a;
System.out.println(a * b + c);
編譯后對(duì)應(yīng)代碼:
? String hint = "Hello world!";
? ? StringBuffer sb = new StringBuffer();
? ? System.out.println(sb.append("Hello world!"));
? ? System.out.println(sb.append(5));
? ? System.out.println(sb);
? ? String hr = "Hello world!";
? ? System.out.println("Hello world!");
? ? System.out.println(hr);
? ? int a = 5;
? ? int b = 6;
? ? int c = 5;
? ? System.out.println(30 + c);
編譯之后就不存在final關(guān)鍵字了,final關(guān)鍵字修飾的基本類型會(huì)在編譯生成類的時(shí)候引用它的地方都會(huì)被替換成那個(gè)不變的值照筑,final修飾的基本類型胸私,可以直接用值厌处,聲明成變量只是為了方便語(yǔ)義理解和涉及多個(gè)地方使用的時(shí)候修改方便。
final修飾對(duì)象的時(shí)候除了String由于本身就是final修飾過(guò)的無(wú)法修改外岁疼,其他對(duì)象只是引用被限制無(wú)法修改(無(wú)法第二次使用=賦值)阔涉,對(duì)象的內(nèi)容和屬性還是可以修改的,所以需要注意final的對(duì)象還是會(huì)變化的只是指向的內(nèi)存空間不會(huì)變化而已捷绒,final關(guān)鍵字編譯時(shí)確定只是針對(duì)基本類型和String類型瑰排,其他對(duì)象的值還是運(yùn)行時(shí)確定的。