final
- 修饰的属性为常量,只能赋值一次,复制后不能被修改,该常量必须被初始化,且初始化必须在声明时或在构造方法中直接赋值。(当我们用static final修饰一些容器类例如ArrayList,HashMap的实例变量,容器不能改变但是可以修改容器里存放的数据)
- 修饰方法时,修饰的方法不能被子类重写,
- 修饰类时,类不能被继承
有时候有人会问final修饰方法时与private修饰的方法有什么区别?
其实这两个关键字是没有什么关系的,private是表示可见性的关键字,而final是一个表示禁止覆盖的关键字,只不过他们在修饰方法时达到的效果是一样的
此处参考
https://www.iteye.com/blog/zangxt-461227
static
static可以修饰属性、方法、代码块、内部类(静态内部类或嵌套内部类)
- static修饰的属性在类加载的时候初始化,初始化后可以改变
- static修饰的属性所有对象都只有一个值
- static修饰的属性强调他们只有一个
static修饰属性、方法、代码块跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等
static与“this、super”不在一起使用,static跟对象无关,而this、super正好跟具体的对象有关。
static不能修饰局变量。
static final
static修饰的属性强调他们在类里只有一个,final修饰的属性表明该属性是一个常数(创建后不能被修改)。
static final修饰的属性表示一旦被赋值就不可以再修改,并且可以通过类名访问,并且该属性只能在声明时赋值,不能再构造方法中进行赋值。
static final修饰方法,表示该方法不能被重写,且可以在没有实体对象的时候用类名直接调用。
transient
- 一旦变量被transient修饰,变量将不再是对象序列化的一部分,该变量内容在序列化后无法获得访问,一个静态变量不管是否被transient修饰,均不能被序列化。
- transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
volatile
volatile能实现变量的修改可见性。被volatile修饰的成员变量每次被线程访问时,都强迫从共享内存中重读该成员变量的值,而且,当成员变量发生变化时,强迫线程将变化后的值写回到共享内存中,这样在任何时候,两个不同线程总是看到某个成员变量的同一个值。
但是volatile不能保证在对变量进行操作时候的原子性。
volatile修饰的变量可以保证有序性。volatile标记的变量不会被编辑器优化,禁止指令重排。当对volatile修饰的属性进行读写操作时(单线程),其前面的代码必须已经执行完成,结果对后续的操作可见。