很多时候我都记不住也弄不太清楚final类在程序的中的作用到底为何,今天正好看到了,就把它记下来,省的以后忘了的时候到处找资料~
final修饰符对程序的影响总的来说有三点:
(1)final可以修饰变量,被final修饰的变量被赋初始值之后,不能对其进行重新赋值。
(2)final可以修饰方法,被final修饰的方法不能被重写。
(3)final可以修饰类,被final修饰的类不能派生出子类。
1.final修饰的变量
首先回顾一下final实例变量的知识,被final实例的变量必须显式的指定初值,而且只能在如下三个位置指定初始值:定义final实例变量时指定初始值,在非静态初始化块中为final实例变量指定初始值,在构造器中为final实例变量指定初始值。本质上final实例变量只能在构造器中被赋初始值。
对于final类变量来说,也必须显式的指定初始值。通常在两个地方指定:定义final类变量时指定初始值,在静态初始化块中指定初始值。而且本质上final类变量都是在静态初始化块中被赋初始值。
对于一个使用final来修饰的变量而言,如果定义该变量的时候就指定初始值,而且这个初始值在编译的时候就可以确定下来,那么这个final变量将不再是一个变量,系统会将其当成“宏变量”处理,也就是说,所有出现该变量的地方,系统将直接把它当成对应的值处理。如果被赋的表达式只是基本的算术运算表达式或者字符串连接运算,没有访问普通变量,调用方法,系统仍旧会将此变量当成“宏变量”处理。
对于final实例变量而言,只有在定义该变量时指定初始值才会有“宏变量”的效果。在非静态初始化块、构造器中为final实例变量指定初始值则没有“宏变量”的效果。对于final类变量也是一样的,只有再定义该变量时指定初始值才会有“宏变量”的效果,在静态初始化块中无效。
2.final修饰的方法
一般而言,用final修饰的方法不能被重写。而且,同时用private和final修饰一个方法没有意义,但是是被java语法允许的。
3.final修饰的类
内部类或者匿名内部类中访问局部变量必须声明为final。