final关键字
final 关键字可用于修饰类、变量和方法,用于表示修饰的类、方法和变量不可改变。
final修饰变量时,表示该变量一旦获得了初始值就不可被改变,final既可以修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。
final修饰成员变量
对于final修饰的成员变量而言,一旦有了初始值,就不能被重新赋值,如果既没有在定义成员变量时指定初始值,也没有在初始化块、构造器中为成员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的值,这些成员变量也就完全失去了存在的意义。因此java语法规定:
final修饰的类Field、实例Field必须由程序员显式地指定初始值。
类Field、实例Field能指定初始值得地方如下:
类Field:必须在静态初始化块中或声明该Field时指定初始值。
实例Field:必须在非静态初始化块、声明该Field或构造器中指定初始值。
Final修饰局部变量
系统不会对局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值;如果final修饰的局部变量在定义时已经指定了初始值,则后面代码中不能再对该变量赋值。
因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值。
final修饰的基本类型和引用类型
final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。
但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变
final方法和final类
final方法
final修饰变量时,表示该变量一旦获得了初始值就不可被改变,final既可以修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。
final修饰成员变量
对于final修饰的成员变量而言,一旦有了初始值,就不能被重新赋值,如果既没有在定义成员变量时指定初始值,也没有在初始化块、构造器中为成员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的值,这些成员变量也就完全失去了存在的意义。因此java语法规定:
final修饰的类Field、实例Field必须由程序员显式地指定初始值。
类Field、实例Field能指定初始值得地方如下:
类Field:必须在静态初始化块中或声明该Field时指定初始值。
实例Field:必须在非静态初始化块、声明该Field或构造器中指定初始值。
Final修饰局部变量
系统不会对局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值;如果final修饰的局部变量在定义时已经指定了初始值,则后面代码中不能再对该变量赋值。
因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值。
final修饰的基本类型和引用类型
final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。
但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变
final方法和final类
final方法
final修饰的方法不可被重写,如果出于某些原因,不希望子类重写父类的某个方法,则可以使用final修饰该方法。
final类
final 修饰的类不可以有子类,例如java.lang.Math类就是一个final类,它不可以有子类。