JAVA final关键字
final关键字
一、基本介绍
可以修饰类、属性、方法和局部变量
有以下需求时,常常用到final来修饰
- 当不希望类被继承时,可以用final修饰。
- 当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰
- 格式:
访问修饰符 final 返回类型 方法名
- 格式:
- 当不希望类的某个属性的值被修改,可以用final修饰
- 当不希望某个局部变量被修改,可以用final修饰
package com.hspedu.final_;
public class Final01 {
public static void main(String[] args) {
E e = new E();
}
}
//要求A类不能被其他类继承,这时用个final修饰A类即可
final class A{
}
/*class B extends A{
}*/
//如果要求hi不能被重写,但是可以被继承,故用final关键字即可
class C{
public final void hi(){
}
}
class D extends C{
//重写了C类的hi方法
/* public void hi() {
super.hi();
}*/
}
class E{
public final double TAX_RATE = 0.08;//加了之后,实例化对象化,不能修改了
}
//当不希望局部变量被修改
class F{
public void Cry(){
final double NUM = 0.01;
// NUM = 0.9;
System.out.println("NUM=" + NUM);
}
}
二、使用注意事项和细节
-
final修饰的属性又叫常量,一般用 XX_XX_XX来命名(是大写的变量名)
-
final修饰的属性在定义时,必须赋初始值,并且以后不能修改,赋值可以在下面三个位置之一
- 定义时:
public final double TAX_RATE = 0.08;
- 在构造器中
- 在代码块中
- 定义时:
-
如果 final 修饰的属性是静态的,则初始化的位置只能是
- 定义时
- 在静态代码块 不能在构造器中
- 因为static 的属性 会在类加载的时候被加载,final关键字修饰的属性必须有初始值,而构造器在类加载时不一定会调用,这个时候就没有初始值,所以不行
-
final类不能继承,但是可以实例化对象
-
如果类没有被final修饰,但含有final修饰的方法,则该方法可以被继承,但是不能被重写
-
一般来说,如果一个类是final类了,就没必要用final去修饰方法了
-
final不能修饰构造方法(即构造器)
-
final和static 往往搭配使用,效率更高,不会导致类的加载。
- 低层编译器做了优化
package com.hspedu.final_; public class FinalDetail02 { public static void main(String[] args) { System.out.println(BBB.num1); //输出:10000 } } //final和static 往往搭配使用,效率更高,不会导致类的加载。 //低层编译器做了优化 class BBB{ public final static int num1 = 10000; static{ System.out.println("BBB 静态变量被加载"); } }
-
包装类(Integer Double,Float, Boolean)等都是final,String 也是final类
- 这些类都是不能被继承的