static,字面意思是静态,在java中可以用来修饰变量、方法、类,也可以形成静态代码块。static修饰的字段和成员方法不依赖于类的任何实例,在类加载时,会提取class的类型信息存放到方法区中。如:类型和直接超类以及直接接口全限定名、类型的常量池、方法信息( 方法名、方法的返回类型、方法的参数的数量和类型、方法的修饰符、方法的字节码、操作数栈和栈帧中局部变量的大小、异常表)、类静态变量等。类的所有实例共享方法区中的类信息。
使用static不需要new出一个类来,最基本的用法
- 类名.变量名或类名.方法名
- 使用import static 静态导入,直接在另一个类中使用变量名和方法名
- static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。
- 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
- 对于方法,表示不可覆盖,并且可以通过类名直接访问。
- 对于被static和final修饰过的实例常量,实例本身不能再改变了,但对于一些容器类型(比如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,但可以修改容器中存放的对象。
静态变量
类中的的成员可以分为静态变量和实例变量。静态变量存在于方法区中,在类加载是完成静态变量的内存分配,被该类的所有实例共享,任何一个实例对静态变量的修改后其他实例访问到的都是改变后的值。实例变量在每创建一个实例之后都会为实例变量分配内存,实例变量可以在内存中存在多个,互不影响。
静态方法
静态方法中不能有this和super关键字,不能访问类的实例变量和实例方法,因为实例成员与特定的对象关联。static方法独立于任何实例,所以static方法不能使抽象的abstract,必须被实现。
静态代码块
静态代码块是在类中独立于类成员的static语句块,不在任何方法体类,加载类时会执行这些静态的代码块,如果static代码块有多个,jvm按照先后顺序依次执行,每个代码块只会被执行一次。如果父类有静态代码块,则先执行父类的再执行子类的。静态代码可以在不创建实例的情况下完成一些初始化工作。
静态内部类
静态内部类无法访问外部类的实例成员,因为其中不包含指向外部类对象的引用,但可以访问外部类的静态成员。静态内部类中可以有静态方法,也可以有非静态方法。静态内部类的初始化方法:外部类.内部类 XXX = new 外部类.内部类();
静态导入
import static导入某个类中的静态资源,这样可以不适用类名.资源名,可以直接使用资源名。
静态绑定机制
被static、private、final修饰的方法以及构造方法都会被编译成invokestatic指令,jvm会使用静态绑定机制来调用这些方法。所谓静态绑定机制,就是在编译阶段就能够确定调用哪个方法的方式。