Java final关键字
可以修饰类、属性、方法和局部变量。
何时使用:
1、不希望某个类被继承,用final修饰该类。
2、不希望父类的某个方法被子类覆盖/重写,用final修饰该方法。
3、不希望类的某个属性的值被修改,用final修饰该属性。
4、不希望某个局部变量被改变,用final修饰。
Java中final和static修饰的变量是在什么时候赋值的?_程序IT圈的博客-CSDN博客
链接中的总结单拎出来:
①单独用final修饰的变量也有可能在字节码找到对应的ConstantValue属性,但是会被JVM忽略掉。
②final修饰的实例属性,在实例创建的时候才会赋值。
③static修饰的类属性,在类加载的准备阶段赋初值,初始化阶段赋值。
④static+final修饰的String类型或者基本类型常量,JVM规范建议在初始化阶段赋值,但是HotSpot VM直接在准备阶段就赋值了。
⑥static+final修饰的其他引用类型常量,赋值步骤和第二点的流程是一样的。?
细节:
1、局部变量使用final修饰,它的值不允许改变,即:
如果是基本数据类型,则不允许值改变。
如果是引用类型,它的值就是地址,只要地址不变就行,指向的对象自身属性可以改变。
2、final修饰的属性也叫常量,一般用XX_XX_XX来命名。
3、final修饰的属性定义时必须赋初值,以后不可修改,可在以下时刻赋初值:
①定义时。
②构造器中。
③代码块中。
4、若final修饰的属性是静态的(static) ,则只能在以下赋初值,不能在构造器赋初值。
①定义时。
定义时直接赋值,赋值操作将会在类加载的准备阶段就赋值完毕。
好处:可以让代码更加简洁
坏处:如果赋值的操作比较耗时,就会影响类的加载速度。
②代码块。(前提是不能在定义时赋值)
常量的初始化被延迟到静态代码块执行时,即初始化阶段。
可以在需要复杂操作时实现更好的控制,而且可以在静态代码块中捕获异常。
5、final不能修饰构造方法。
6、final + static往往搭配使用,效率高,不会导致类加载,底层编译器做了优化。
7、方法形参也可以使用final修饰。