final修饰符是JAVA中比较简单的一个修饰符,不少人经过书本就能够熟练掌握,但我学的时候,虽然感受会用了,可是并非十分理解这个修饰符,因此我找了相关资料,把个人我的理解分享给你们~~缓存
final书本定义:ide
1.final能够修饰变量,被final修饰的变量被赋初值后,不能对它从新赋值测试
2.final能够修饰变量,被final修饰的方法被重写spa
3.final能够修饰类,被final修饰的类不能派生子类blog
总的来讲,就是值不能改,方法不能重写,类不能继承,就至关因而终结版。。。。继承
1、final修饰的变量字符串
被final修饰的实例变量必须显示地赋初值,且只能如下三种方式:编译器
一、定义时初始化编译
二、在非静态初始化块中为final实例变量指定初始值test
三、在构造器中指定初始值
对于局部变量,则必须赋初值,且赋值后不能再改变~
给个例子:
2、宏变量
对于一个final变量,无论它时类变量、实例变量、仍是局部变量,只要定义该变量时使用了final修饰,并在定义该final类变量时指定了初始值,并且该初始值能够在编译时被肯定下来,那么这个final变量实质上已经不是变量,至关于一个恒量或者是直接量。
那么,何为宏变量?顾名思义,我以为,所谓宏变量,其实就是恒变量。当定义final变量时就为该变量指定了初始值,并且该初始值在编译时就已经肯定下来,那么这个final变量本质上就是一个“宏变量”,编译器会把程序中全部用到该变量的地方直接替换成该变量的值。
下面举一个经典例子,相信你们都遇到过:
你们先看test测试单元,这是没有添加final修饰符的,那么测试结果为 true/false。str1是一个普通字符串,str2是两个字符串直接量进行链接,因为编译器能够在编译阶段就肯定s2的值”JAVAEE“,因此系统会让s2直接指向字符串池中缓存中的”JAVAEE"字符串,因此str1==str2,返回结果为true。而对于str5而言,它的值由str3和str4链接获得,可是不是由两个直接量链接,所以编译器不会执行“宏替换”,所以编译器没法在编译时肯定str5的值,不会让str5指向字符串池中缓存中的“JAVAEE”,因此输出false.
你们再来看test2测试单元,只要给str3和str4添加final修饰符,将其变成宏变量,则编译器就能肯定str5的值,从而输出true.
PS:对于final实例变量而言,若是要将其变为“宏变量",则必须在定义该变量时就赋初值,不然无效,下面给个例子:
3、final方法不能被重写
上面程序Base类中,用final定义父类info方法,可是被final定义的方法是不能重写的,因此exe7中的info的方法并非重写Base中的方法,只是子类中的一个普通方法,若是要检查子类中的方法是否是重写父类中的方法,能够给方法强制添加@Override注释,若是方法报错,则不是重写方法。
4、内部类中的局部变量
注意:若是程序要在内部类中使用局部变量,那么这个局部变量必须使用final修饰!
PS:此处说的内部类指的是局部内部类,由于只有局部内部类(包括匿名内部类)才能够访问局部变量,普通静态内部类、非静态内部类不可能访问方法体重的局部变量。