静态变量与代码块
静态变量:
静态变量即类变量,在类中方法之外以statis关键字声明,类的所有对象之间共享。
静态变量在类加载连接阶段的准备阶段在方法区分配内存并设置类变量的初始值(类型的默认值),在首次使用时初始化赋予正确值。
静态变量一般都被声明为常量使用 (public static final),静态常量(即用 static final 修饰的变量)是编译时常量,在编译期即把结果放入常量池。
类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1. 创建类的实例
2. 调用类的静态方法
3. 使用类的非 常量 静态字段
4. 调用Java API中的某些反射方法
5. 初始化某个类的子类
6. 含有main()方法的类启动时
多个静态变量初始化的顺序:
多个静态变量的初始化顺序是按照它们在代码中的出现顺序进行的。也就是说,代码中先出现的静态变量会先被初始化,后出现的静态变量会后被初始化
注意:如果前一个静态变量引用后面的静态变量,获取不到后面静态变量初始化后的正确值,只能获取到初始值
静态代码块:
static{
// 静态代码块
}
静态代码块是给类初始化的。
在类加载的初始化阶段时候就被调用,并且只执行一次,且优先于main函数
在类加载的初始化阶段执行静态代码块(静态代码块只能访问定义在静态代码块之前的静态变量,定义在静态代码块之后的静态变量,可以赋值,但是不能访问)
静态代码块是先于构造方法执行的特殊代码块
构造代码块:
{
//构造代码块
}
构造代码块是给类对象初始化的。
每一次创建对象时执行一次
对于一个类而言,按照如下顺序执行:
1、执行静态代码块
2、执行构造代码块
3、执行构造函数
对于静态变量、静态代码块、变量、构造代码块、构造器,它们的初始化顺序依次是(静态变量、静态代码块)>(变量、构造代码块)>构造器。
当涉及到继承时,按照如下顺序执行:
1、执行父类的静态代码块,并初始化父类静态成员变量
2、执行子类的静态代码块,并初始化子类静态成员变量
3、执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
4、执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量
END.