重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
java中final和static关键字的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
目前成都创新互联公司已为成百上千的企业提供了网站建设、域名、雅安服务器托管、网站托管运营、企业网站设计、双柏网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
final关键字
1.final关键字在单线程中的特点:
1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次。
2)final修饰的类成员变量,可以在三个地方进行赋值:显示初始化、构造代码块和构造方法,并且仅能赋值一次。
3)final修饰的局部变量,必须在使用之前进行显示初始化(并不一定要在定义是赋值),仅能赋值一次。
总之,final修饰的静态成员必须在类加载完之前进行赋值,final修饰的成员变量,必须在对象创建完之前进行赋值。
补充:final修饰的基本数据类型不能被重新赋值,final修饰的引用数据类型,引用类型的地址不能改变,引用类型的内部属性可以改变。
2. final在多线程的作用
由于重排序的作用,一个线程读取到一个对象的引用时,该对象可能尚未初始化完毕,即这些线程可能读取到该对象字段的默认值而不是初始值。
final关键字具有特殊的作用:当一个对象发布到其他线程的时候,该对象的所有final字段都是初始化完成的,即其他线程读取到的都是相应字段的初始值而不是默认值。而非final字段就没有这种保障。
对于final修饰的引用类型的字段,该字段还能保障该字段所引用的对象 初始化完毕。
这种机制是通过禁止重排序实现的:
对于final变量的写:禁止final域的写重排序到构造方法之外,即得到一个对象的引用时,其内部的final域必定已被初始化完毕。
对于final域的读:禁止初次读该对象的引用与读该对象包含的final域进行重排序。
这两种重排序都是底层是通过内存屏障实现的,编译器会在final域写之后,构造函数执行完之前插入一个storestore屏障,在读final域之前插入一个loadload屏障。
static关键字
static关键字能够保证一个线程即使在未使用其他线程同步机制的情况下也总是可以读到一个类静态变量的初始值,但这种可见性的保障仅限于 初次读取该变量
关于java中final和static关键字的作用是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。