final关键词
用于表示它修饰的类,方法,变量不可改变
修饰变量时,一旦其获得了初始值,就不可改变,它既可以修饰成员变量,也可以修饰局部标量,形参等
final修饰的成员变量必须现实的指定初始值,系统不会饮食的对其进行隐式初始化
例如
public class FinalVariableTest { public void test(final int a) { //a=5;//错误,应该由系统传入的参数进行初始化,所以这里不能被赋值 } public static void main(String[] args) { final String str="zx";//定义局部变量默认值,则不能再被赋值 //str="12";//错误,不能再被赋值 final int a;//没有指定默认值,可以被赋值一次 a=5; //a=4;//再次被赋值,错误 } }
final修饰的基本类型变量和引用类型变量区别
对于引用类型变量来说,他保存的仅仅是一个引用,final只保证所引用的地址没变,即引用的是同一个对象
但是对象时可以随意改变的
例如
class PersonClass { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public PersonClass(){} public PersonClass(int age) { this.age=age; } } class Go { public static void main(String[] args) { final PersonClass pClass=new PersonClass(45); // pClass=null;//引用的不再是原来的对象了,所以出错 } }
final方法表示不希望子类重写父类的某个方法
比如
class BaseClass { public final void get() { } private final void set() { } } class SonClass extends BaseClass { //public void get();//会出错,不能重写final方法 public void set() { }//因为private子类无法访问,就相当于创建了一个新方法 }
具体还有不可变类,出现的场合,比如你项目初始化一些不可变的参数,例如你使用一个map保存了项目中所有的配置文件的键值对,这些键值对是永不变的,为了防止客户的改变,你可能就需要使用不可变类,每个返回给用户一个保护性的拷贝。
只要不是固定的,永不改变的东西,对于类的设计都不需要不可变类,不可变的类的实现也是需要消耗一定的内存和性能的,可以通过缓存不可变类来实现减少开销,具体实现方法,待写