java之final关键字

免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动

final关键字

1.1 基本介绍

final中文意思:最后的,最终的

final可以修饰类、属性、方法和局部变量

在某些情况下,程序员可以能有一下需求,就会使用到final:

  1. 当不希望类被继承时,可以使用final修饰
  2. 当不希望父类某个方法被子类覆盖/重写(override)时,可以使用final关键字修饰
  3. 当不希望类的某个属性的值被修改,可以使用final修饰 【public final double TAX_RATE=0.08】
  4. 当不希望某个局部变量被修改,可以使用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 }

 

posted @ 2024-07-11 10:23  万溪汇海  阅读(0)  评论(0编辑  收藏  举报