final关键字
参考资料:【Thinking in JAVA】
修饰变量
- final修饰变量时,必须在定义处或者每个构造器中对变量进行赋值,确保final域在使用前肯定被初始化;
①修饰基本类型或者包装类直接赋值时,变量的值恒定不变;
②修饰类的引用或者数组时,引用恒定不变;
(一旦引用被初始化指向一个对象,就无法改为指向另一个对象,但是对象本身的内容是可以被修改的)
1.一个永远不变的编译时常量;
当final修饰基本数据类型或者String类型且直接赋值的变量,并在定义时赋值,那么在程序编译时,就可以确认该变量的值,这类变量称之为编译期常量;
特点:定义时必须赋值,必须是基本数据类型或者是直接赋值的String类型;
优点:编译器在编译时可以将常量值代入到任何使用它的计算式中,可以编译时执行这些计算式,减少运行时负担;
缺点:当编译期常量值变更时,需要重新编译所有引用它的类,改变才会对于这些类生效,未编译的类则还是使用旧值;
2.一个在运行时被初始化的值,而你不希望它被改变;
特点:在成员所属类的每个构造器中进行赋值;
空白final:指被声明为final但是又未在定义处给定初值的域,但是在任何情况下,编译期会确保空白的final在使用前必须被初始化;空白final给关键字final的使用提供了极大的灵活性,对于一个类来说,就可以做到每个实例,final成员给不相同,又恒定不变;[Think in JAVA]
final参数:在函数的参数列表中,以声明的方式将参数指定为final,这样可以读取参数,但无法在函数中更改参数引用所指向的对象或者基础数据类型、String类型的值;
修饰方法
特点:
1.锁定方法:设计时考虑类的继承中,使方法行为保持不变,并且不会被覆盖;
2.执行效率:使用final修饰方法,则编译器可以将针对该方法的所有调用转为内嵌调用;
private和final:类中所有的private方法都隐式的被指定为final的,由于无法取用private的方法,也就无法覆盖它,所以当使用final修饰private方法,不会为该方法添加任何额外的含义;
修饰类
类整体定位为final时,该类不能被继承,该类的成员可以根据需要选择是final或者不是final;但是final类中的所有的方法也会被隐式的声明为final类型,因为无法集成覆盖它们;