static关键字主要有4种使用情况:成员变量,成员方法,代码块和内部类。
1.成员变量
虽然java中没有全局的概念,但可以通过static关键字来达到全局的效果。java类型提供了两种类型的变量,用static关键字修饰的静态变量和不用static关键字修饰的实例变量。 静态变量属于类,只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。
不能在方法体中定义static变量。
public static void add(){
// static final int i = 0; // 编译失败,只能在类中定义静态变量,不能在方法中定义静态变量
}
2. 成员方法
与变量类似,java类同时也提供了static方法与非static方法。static方法是类的方法,不需要创建对象就可以被调用。static不能使用this和super关键字,不能调用非static方法。
static一个重要的作用是实现单例模式,单例模式的特点是该类只能有一个实例。
public class TestStatic{
static{
// 加载类时, 执行静态代码块
System.out.println("....static......");
}
private static TestStatic f = new TestStatic(); //加载类时,为静态变量赋初值, 当去掉static,就会造成无限引用,引发栈溢出
{
System.out.println("..non..static.......");
}
public TestStatic(){
System.out.println("......构造....");
}
public static void main(String[] args){
System.out.println("main");
TestStatic ff = new TestStatic();
}
}
3.static代码块
静态代码块在类中是独立于成员变量和成员函数的代码块的。它不在任何一个方法体内,jvm在加载类时会执行static代码块,如果有多个static代码块,jvm将会按顺序来执行。这些static代码块只会被执行一次。
4. static内部类
static内部类是指被声明为static的内部类,它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。
static经常与final结合使用:
static final修饰变量,表示变量一旦赋值,不能被修改,并且通过类名可以访问该变量。
static final修饰方法,表示该方法不可覆盖,并且可以通过类名直接访问。