可以修饰变量(各种变量)、方法、类。
final与abstract是互斥:不可能同时出现。
final修饰变量
该变量被赋初始值之后,不能重新被赋值!
final修饰的变量必须被显式赋值,且只能赋值一次。
final修饰成员变量
-
非final的成员变量:程序员可以不显式指定初始值,系统会为之分配默认初始值,初始值分配规则与数组元素的初始值规则完全相同
-
final的成员变量:程序员必须显式指定初始值。
-
final实例变量
必须显式指定初始值。只能在以下3个位置的其中一个指定:
①定义时指定初始值
②实例初始化块
③构造器
这3个位置本质上其实只有一个:构造器 -
final类变量
必须显式指定初始值。只能在以下2个位置的其中一个指定:
①定义时指定初始值
② 类初始化块
这2个位置本质上其实只有一个:类初始化块。 -
final修饰局部变量
①非static的局部变量,程序员必须先指定初始值,然后才能使用。
② final的局部变量,程序员必须先指定初始值,然后才能使用;final局部变量不能被重新赋值。 -
final修饰的时引用类型的变量
final只保证该引用变量本身不会被重新赋值,该变量所引用的对象完全可以被修改。 -
final修饰的“宏替换”的变量
如果一个变量满足以下3个条件:
①变量有final修饰
②声明变量时指定了初始值
③变量的初始值可以在编译时确定(初始值的表达式中没有变量、方法调用等)
这个变量就会消失,所有出现该变量的地方,在编译时就会替换成该变量的值。
final修饰方法
- 表明该方法不能被子类重写。
- 但该方法可以被重载。
- 也可以被子类调用。
【备注:】private方法已经被隐藏在类的内部,子类无法访问该方法,因此不可能被重写。
final修饰private纯属多余
final修饰类
表明该类不能派生子类。
jdk里很多类都是final:String、Math、System
Object不可能是final类,因为它是所有类的祖先。