java 中的static和final怎么使用?它们的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中的static和final怎么使用?它们的区别?相关的知识,希望对你有一定的参考价值。
我一直不理解这一块,希望清楚的高手能帮忙分析说明一下。万分感谢
static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;修饰一个程序块的时候(也就是直接将代码写在static...中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。final可以修饰变量、方法及类,当你定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;当你定义一个方法时,改方法在子类中将不能被重写;当你修饰一个类时,该类不能被继承。 参考技术A static表示静态的,是该类的所有对象共享的资源,可以用来修饰变量和方法,也可以修饰一个代码块。
final用来修饰变量的时候表示该变量是一个常量,不能再程序修改变量的值,用来修饰方法的时候,表示该方法不能被重写;用来修饰类的时候,表示该方法不能被继承。 参考技术B static如果用这个修饰你女朋友就意味着你女朋友是所有人的女朋友。
final如果用这个修饰你女朋友那就是意味着她已经变成你老婆了,你甩不掉了。只给你一次初始化机会。 参考技术C static可以修饰代码块和变量,而final可以修饰变量和类。
static 表示静态的,从始至终只获得一块内存空间。而且这块空间的资源还具有“全局性”,就是说所有的成员都可以无条件引用,另外,static修饰的不用程序调用,只要该类被执行,static修饰的也被执行。如最常见的,Public static void main();又如 static int a;那么所有的成员都可以引用a.
final 表示最终的,它修饰的类不能有子类。它修饰的变量是不可变的常数,所以final的变量要立刻赋值。如:class final A 类A就不能被别的类继承;final String a=“abc”;那么a永远只能是abc.
fianl static String a=“abc”;那么a不但是一个常数,还是一个全局常数。 参考技术D static修饰静态的成员,即属于类的成员变量或方法。
final是最终。修饰的变量其值不能再改变,可算是常量。修饰的方法不能被复写。
java多线程04----------final和static
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 中的static和final怎么使用?它们的区别?的主要内容,如果未能解决你的问题,请参考以下文章
一脚踩进java之基础篇19——面向对象 (final,static关键字)
一脚踩进java之基础篇19——面向对象 (final,static关键字)