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
     }
}

三。内部类使用的外部变量

     

应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,而内部类却不会离开它所在方法就失去作用,它有更广的生命周期。

   

原文地址:https://www.cnblogs.com/yuyutianxia/p/3836700.html