static的主要作用在于创建独立于具体对象的域变量或者方法。
1、静态变量
又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。
区分实例变量,每创建一个实例就会产生一个实例变量。 类变量随着类的加载而存在于方法区中。实例变量随着对象的建立而存在于堆内存中。类变量生命周期最长,随着类的消失而消失。实例变量生命周期随着对象的消失而消失。
2、静态方法
可通过“类.静态方法”调用;静态方法中只能调用静态方法或静态属性,如果想调用非静态方法或属性,需要new一个对象;静态方法中不能有this和super;
3、静态代码块
在类被初次加载时执行,且执行一次,通常将只需要进行一次的初始化操作都放在static代码块中进行。
4、静态内部类
内部类: 定义在类内部的类叫做内部类,内部类持有外部类的引用,所以能够访问外部类的所有变量和方法,内部类一般只为外部类使用,且内部类能够独立的继承接口。外部类对象通过 ‘外部类名.this.xxx’ 的形式访问内部类的属性与方法。
static修饰之后就叫做 静态内部类,或嵌套类,要创建静态内部类的对象,并不需要其外部类的对象;也没有持有外部类的引用。不能够从静态内部类的对象中访问外部类的非静态成员。
public class OuterClass{
class InnerClass{
}
static class StaticInnerClass{
}
public static void main(String[] args){
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
}
}
5、初始化顺序
由父及子,静态先行
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)