java之final关键字
免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动
final关键字
1.1 基本介绍
final中文意思:最后的,最终的
final可以修饰类、属性、方法和局部变量
在某些情况下,程序员可以能有一下需求,就会使用到final:
- 当不希望类被继承时,可以使用final修饰
- 当不希望父类某个方法被子类覆盖/重写(override)时,可以使用final关键字修饰
- 当不希望类的某个属性的值被修改,可以使用final修饰 【public final double TAX_RATE=0.08】
- 当不希望某个局部变量被修改,可以使用final修饰【final double TAX_RATE=0.08 】
1 public class Final01 { 2 public static void main(String[] args) { 3 E e = new E(); 4 //e.TAX_RATE = 0.09; 5 } 6 7 } 8 9 //如果我们要求A类不能被其他类继承 10 //可以使用final修饰A类 11 final class A{} 12 13 //class B extends A{} 14 15 class C{ 16 //如果我们要求hi不能被子类重写 17 //可以使用final修饰hi方法 18 public final void hi(){} 19 } 20 21 class D extends C{ 22 // @Override 23 // public void hi(){ 24 // System.out.println("重写了C类的hi方法..."); 25 // } 26 } 27 28 //当不希望类的某个属性值被修改,可以使用final修饰 29 class E{ 30 public final double TAX_RATE = 0.08;//常量 31 } 32 33 //当不希望某个局部变量被修改,可以使用final修饰 34 class F{ 35 public void cry(){ 36 //这时,NUM也成为局部常量 37 final double NUM = 0.01; 38 //NUM=0.9; 39 System.out.println("NUM="+NUM); 40 } 41 }
1.2 final使用注意事项和细节讨论
- final修饰的属性又叫常量,一般用XX_XX_XX来命名
- final修饰的属性再定义时,必须赋初值,并且以后不能再修改,赋值可以再如下位置之一
- 定义时:如 public final double TAX_RATE=0.08;
- 在构造器中
- 在代码块中
- 如果final修饰的属性是静态的,则初始化的位置只能是
- 定义时
- 在静态代码块,不能再构造器中赋值
- final类不能继承,但是可以实例化对象
- 如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承
1 public class FinalDetail { 2 public static void main(String[] args) { 3 CC cc = new CC(); 4 new EE().cal(); 5 } 6 } 7 8 class AA{ 9 /** 10 * 1.定义时:如 public final double TAX_RATE = 0.08; 11 * 2.在构造器中 12 * 3.在代码块中 13 */ 14 public final double TAX_RATE = 0.08;//1.定义时赋值 15 public final double TAX_RATE2; 16 public final double TAX_RATE3; 17 18 public AA(){//构造器中赋值 19 TAX_RATE2 = 1.1; 20 } 21 22 { 23 TAX_RATE3 = 8.8;//在代码块中赋值 24 } 25 } 26 27 class BB{ 28 /* 29 如果final修饰的属性是静态的,则初始化的位置只能是 30 1.定义时 31 2.在静态代码块 不能在构造器中赋值 32 */ 33 public static final double TAX_RATE = 9.9; 34 public static final double TAX_RATE2; 35 36 static{ 37 TAX_RATE2 = 5.5; 38 } 39 } 40 41 //final类不能继承,但是可以实例化对象 42 final class CC{} 43 44 //如果类不是final,但是含有final方法,则该方法虽然不能重写,但是可以被继承 45 //即,仍然遵守继承机制 46 class DD{ 47 public final void cal(){ 48 System.out.println("cal()方法"); 49 } 50 } 51 52 class EE extends DD{}
- 一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法
- final不能修饰构造方法(即构造器)
- final和static往往搭配使用,效果更高,不会导致类加载,底层编译器做了优化处理
- 包装类(Integer,Double Float,Boolean等都是final),String也是final类
1 public class FinalDetail02 { 2 public static void main(String[] args) { 3 System.out.println(BBB.num); 4 5 //包装类,String 是final类,不能被继承 6 } 7 } 8 9 //final和static往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理 10 class BBB{ 11 public final static int num = 10000; 12 static{ 13 System.out.println("BBB静态代码块被执行"); 14 } 15 } 16 17 final class AAA{ 18 //一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法 19 //public final void cry(){} 20 }