本文通过一段代码探讨一下java Final关键字对基本类型和对象类型的修饰差异,编译前部分代码:
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);
编译后对应代码:
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关键字了,final关键字修饰的基本类型会在编译生成类的时候引用它的地方都会被替换成那个不变的值,final修饰的基本类型,可以直接用值,声明成变量只是为了方便语义理解和涉及多个地方使用的时候修改方便。
final修饰对象的时候除了String由于本身就是final修饰过的无法修改外,其他对象只是引用被限制无法修改(无法第二次使用=赋值),对象的内容和属性还是可以修改的,所以需要注意final的对象还是会变化的只是指向的内存空间不会变化而已,final关键字编译时确定只是针对基本类型和String类型,其他对象的值还是运行时确定的。