在Java里,final关键字最终的、不可更改的。 作“不可更改的”来解释更合适,即由final修饰的东西是“不可更改的”。final可以修饰变量、成员方法和类,还可以修饰方法的参数,但参数归根结底还是变量
1.final可以修饰成员变量、局部变量
:变量用前要初始化,值不可更改,不能再次赋值(对于对象的引用,请引用相当于地址,因此赋给final变量的是地址值,地址值不可变,但其内容可变。详解如下 :
(1).final修饰的变量的值不能更改,即不能再次赋值,即使赋的新值与旧值一样也不可以。
如:
final int i = 1; //定义int型变量i,并赋初值为1
//i = 2; //wrong
//i = 1; //wrong
注释掉的这两行都不可以,都会出现“The final local variable i can not be assigned.It must be blank and not using a compound assignment.”的错误。
(2).final修饰的成员变量和局部变量需要在使用前赋值。
1).对成员变量而言,可以在定义时直接赋初值;
2).也可以先定义不赋初值,再在构造方法中对其赋值。
3).如果静态成员变量被修饰为final,那么该变量可看成是全局变量,即在类的整个加载期间,其值都不可变。
如:
static final String citizenship = "Chinese";
citizenship既是static又是final的,static说明它是属于整个类的,类加载时就分配内存了(参见笔记9),final说明其值不可变,即,位置固定内容也固定。
(3).把成员变量和局部变量从变量的类型上来分,
1).当变量为基本数据类型时,变量的值不可更改,如上面的变量i;
2).当变量为引用类型时,变量本身的值不可更改,即该变量不能指向其他的对象或数组;
但该变量指向的对象或数组本身的内容是可以改变的;
总结:final修饰成员变量、局部变量:用前要进行赋值(早:声明时、晚:通过构造函数),运行过程中不可更改,否则报错
2.final可以修饰成员方法
final修饰的成员方法不能被子类重写
3.final可以修饰成员方法的参数
由final修饰的成员方法的参数也是不能更改的,其实参数就是变量
4.final可以修饰类
由final修饰的类不能被子类继承,其成员方法也默认为final的,但成员变量是可以改变的