final 关键字的 8 个小细节



final 修饰类成员变量和实例成员变量的赋值时机
声明变量的时候直接赋初始值 在静态代码块中给类变量赋初始值
public class FinalTest { //a变量直接赋值private final static int a = 1;private final static int b;//b变量通过静态代码块赋值static {b=2;}}
在声明变量的时候直接赋值 在非静态代码块中赋值 在构造器中赋初始化值
public class FinalTest {//c变量在在声明时直接赋值private final int c =1;private final int d;private final int e;//d变量在非静态代码块中赋值{d=2;}//e变量在构造器中赋值FinalTest(){e=3;}}

当 final 修饰的成员变量未对它进行初始化时,会出现错误吗?


final 修饰基本类型变量和引用类型变量的区别
public class FinalTest {//在声明final实例成员变量时进行赋值private final static Student student = new Student(50, "Java");public static void main(String[] args) {//对final引用数据类型student进行更改student.age = 100;System.out.println(student.toString());}static class Student {private int age;private String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}}}//下面是打印结果Student{age=100, name='Java'}
当 final 修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,因此基本数据类型变量不能被改变。 对于引用类型变量而言,它仅仅保存的是一个引用,final 只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象里面的属性是可以改变的。

final 修饰局部变量的场景


final 修饰方法会对重载有影响吗?重写呢?
public class FinalTest {public final void test(){}//重载方法不会出现问题public final void test(String test){}}


final 修饰类的场景

写 final 域的重排序规则,你知道吗?
JMM 禁止编译器把 final 域的写重排序 到 构造函数 之外 编译器会在 final 域写之后,构造函数 return 之前,插入一个 StoreStore 屏障。这个屏障可以禁止处理器把 final 域的写重排序到构造函数之外
public class FinalTest{private int a; //普通域private final int b; //final域private static FinalTest finalTest;public FinalTest() {a = 1; // 1. 写普通域b = 2; // 2. 写final域}public static void writer() {finalTest = new FinalTest();}public static void reader() {FinalTest demo = finalTest; // 3.读对象引用int a = demo.a; //4.读普通域int b = demo.b; //5.读final域}}


读 final 域的重排序规则,你知道吗?
public class FinalTest{private int a; //普通域private final int b; //final域private static FinalTest finalTest;public FinalTest() {a = 1; // 1. 写普通域b = 2; // 2. 写final域}public static void writer() {finalTest = new FinalTest();}public static void reader() {FinalTest demo = finalTest; // 3.读对象引用int a = demo.a; //4.读普通域int b = demo.b; //5.读final域}}


结束

程序员如何避免陷入“内卷”、选择什么技术最有前景,中国开发者现状与技术趋势究竟是什么样?快来参与「2020 中国开发者大调查」,更有丰富奖品送不停!

☞百架无人机“失控撞楼”,程序员写的 Bug?
☞百度推出开发者搜索 Beta;雷军手机使用时长曝光;苹果败诉,电脑上可以模拟 iOS 系统 | 极客头条
☞我们差点就用不上 Java 了!
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平同马克龙交流互动的经典瞬间 7904690
- 2 黑龙江水库冰面下现13匹冰冻马 7809357
- 3 微信表情包戒烟再度翻红 7712306
- 4 2025你的消费习惯“更新”了吗 7616551
- 5 存100万存20万利率一样透露啥信号 7523233
- 6 劲酒如何成了年轻女性的神仙水 7426843
- 7 中俄两军举行第3次反导联合演习 7329145
- 8 女子裤子内藏2斤多活虫入境被查 7238717
- 9 杭州野生动物园黑熊突然袭击饲养员 7143242
- 10 中疾控流感防治七问七答 7039346









CSDN
