一、首先,我们得明白,final的定义。
1、final类作为java关键词, 可以修饰类、方法和变量,用于表达被它所修饰的内容一旦赋值就不可改变
2、final可修饰的变量可以分为静态变量(static修饰,也称类变量)以及实例变量(成员变量及局部变量)
a、给静态变量赋值有且只有2个时机:声明变量、静态代码块(静态变量赋值图)
b、给成员变量赋值有且只有3个时机:声明变量、非静态初始化代码块、构造器(成员变量赋值图)
c、局部变量只能手动初始化,如果没有初始化,有且只有一次机会进行赋值(局部变量赋值图)。
d、引用变量被final修饰之后,引用地址不变,指向对象的内容是可变的(final修饰引用数据变量图)
静态变量赋值图.png
成员变量赋值图.png
局部变量赋值图.png
final修饰引用数据变量.png
3、当一个类被final修饰时,表名该类是不能被子类继承的。
4、父类的final方法是不能够被子类重写的,final方法是可以被重载的
5、当final变量是基本数据及String类型时,如果编译期间知道它的确切值,则编译器会把它当做常量(如下图)
image.png
java是值传递,这点在看有关final参数引用资料中提及了,这个看的有点模糊,以后研究
有关final的深入,还有多线程并发的情况,具体表现为final域重排序规则,暂时这个还没看懂,搁置。