final和const的联系和区别


联系

  • 都是定义常量

    区别

  • 本质区别:final是惰性检查机制,在程序运行的时候才检查值. const在编译的时候就会检查。

  • final既可以定义运行时常量又可以定义编译时常量,const只能定义编译时常量

    1. ps:当涉及到方法的调用时,依赖于类及其初始化,只能在运行时才能确定。

    ```java // 同时赋值已经确定好的值const和final是没有区别的 const date = ‘2020-09-01’; final date2 = ‘2020-09-01’;

    // 赋予不确定的值const和final就不一样了 // const 在编译的时候值都必须是确定的 const date3 = new DateTime.now(); //错误的, 会报错

    // final是在运行的时候才赋值 final date4 = new DateTime.now(); //正确的, 不会报错

```

一道面试题:编译时常量存在什么样的风险?

编译时常量,在使用时会被直接写成值,而不会再从原来的类中读取。这样就会导致问题的产生:如果A类定义了常量,B类使用了常量,并且都进行了编译。当A类的源码被改动了,常量的值发生了变化。我们对A类进行了重新编译,但是没有对B类进行重新编译;那么B类中用到的是原来A类中的常量值,即旧值。这就导致了风险的发生。
[

](https://blog.csdn.net/Honeyhanyu/article/details/77878120)