1、static
(1)修饰的变量,称为静态变量。
- 静态变量不依赖实例对象,一旦类被加载,就会被JVM分配 分配存储空间。、
- 生命周期和类相同,可以通过类名访问。
- 静态变量被所有该类的对象共享,在内存中只要一个副本。
- static不能修饰局部变量。
(2)修饰的方法,称为静态方法。
- 静态方法的访问不依赖对象,只要类被加载,则可以通过类名访问。
- 静态方法不能访问非静态变量。
- 修饰类时,只能修饰内部类,外部类不能使用static修饰。
(3)修饰代码块,称为静态代码块
- static{ }中的代码,常用于类初始化时为静态变量赋值。
static {
System.out.println(" Hello World");
}
注意:Java中初始化顺序:
- 父类静态变量--> 父类静态代码块 --> 子类静态变量 --> 子类静态代码块 -->
- 父类非静态变量 --> 父类非静态代码块 --> 父类构造方法 -->
- 子类非静态变量 --> 子类非静态代码块 --> 子类构造方法
(4)只能修饰内部类,称为静态内部类
- static如果修饰外部类,直接无法编译。
- 静态内部类只能访问外部类的静态变量和静态方法,即使private修饰的也可以访问。
2、final
- final修饰变量时,必须初始化或者在构造器中初始化,否则会报错。
- final修饰的变量时只读的,在多线程中共享是线程安全的。
- final修饰的方法不可被子类重写。
- final修饰的类不能被继承。
3、volatile
- volatile修饰的变量保证了可见性,使得所有线程对该变量的访问 都必须从内存中读取;
- volatile禁止指令重排序;
- volatile不能保证原子性。