举例说明:
final String s = "hello";
这里final是修饰变量s的,而不是修饰"hello"
至于说String不能修改,是因为String类是immutable的,就是不能修改的意思,immutable也是一个修饰符
final StringBuffer sb = new StringBuffer("hello");
这里final修饰了sb,sb就不能指向其它对象了
比如sb = new StringBuffer("hi");这样是不允许的
但是sb所指向的那个对象本身还是可以改变的
比如sb.append(" world");是允许的,因为sb并没有变,sb仍然指向的是那个对象,变化的是对象本身
JAVA的机制:在传递参数前总是将参数拷贝一份。
final并不是说:参数 p 的值必须与变量 sb 的值完全相同!而是指参数 p 不能被重新分配空间!
看代码:
public class Testext {
public static void main(String[] args) throws Exception {
StringBuffer sb = new StringBuffer("gh");
method(sb);
}
public static void method(final StringBuffer p) {
p = new StringBuffer(); //这里出错了:The final local variable p cannot be assigned. It must be blank and not using a compound assignment
p.append("agh");
p.append("a22");
System.out.println(p);
}
}
首先简单理解啊,比如final int X = 6;之后X还能被赋值吗?显然是不能的。原因就是final修饰的变量必须在定义时就被初始化。对于final修饰的对象引用当然也只能被赋值一次啦
所以final StringBuffer a=new StringBuffer("immutable")中的a不能再被赋值。