final 变量
一。final对象
使用final关键字修饰一个变量时,是指引用不能变,引用的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable"); // a=new StringBuffer(""); //编译出错 a.append(" broken!"); // 可以
传入final参数不能阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param){ param.append("a"); }
3.数组也是对象
final int[] count=new int[1]; //count[0] = 9; count[0] = 100 都可以
综上:栈上的内容不能修改,但堆上的内容可以修改。
数组元素是存在堆中的,但是直接给一个变量赋值, 是在栈中直接对变量赋值,数组是从栈中向堆中引用。我画不了图,╮(╯▽╰)╭ ,
简单的说,数组是两部分组成的,栈中定义的是变量和引用,然后数组又有0、1、2、……,对应着数组中的元素,所以final定义的数组,
数组里面的值就能改,而final定义的直接给一个变量赋值就不能改。
二。final 基本类型
public class Something { public int addOne(final int x) { return ++x; //出错 。 x 被修饰成final } }
三。内部类使用的外部变量
应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,而内部类却不会离开它所在方法就失去作用,它有更广的生命周期。