引子:曾经看见一句话,初学Java你就该知道static可以修饰方法和变量。学Java一年你就该知道静态内部类。学Java三年你就该知道静态代码块。
1.静态变量
Java中static只能修饰成员变量,不能修饰局部变量。静态变量存储于JVM内存区的Method Area(方法区)。static常与final一起使用,定义常量。
2.静态方法
静态方法在类定义的时候已经被装载和分配,静态方法可以直接通过类名调用。静态方法只能调用static修饰的成员变量和方法,静态方法不持有this引用。
3.静态内部类
static修饰类的时候,只能修饰内部类。因为匿名内部类和非静态内部类隐式的持有外部类的this引用,所以经常在Android中使用来避免内存泄露。单例模式可以通过静态内部类的方式构造,classloader的机制可以保证初始化instance时只有一个线程,所以也是线程安全的。
4.静态代码块
静态代码块是在虚拟机加载类的时候执行的,只执行一次。如果有多个static代码块JVM将按照它们在类中出现的先后顺序依次执行它们。非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。
静态代码块是主动执行的,静态方法是被调用的时候才执行的。
5.静态导入
静态导入是JDK1.5之后的新特性。可以在导包的时候import static导入包也可以直接导入静态方法。在使用的时候可以直接方法名调用。虽然静态导包减少了代码,但是牺牲了代码的可读性。使用的时候要慎重。