Java静态变量加载赋值问题
static在JVM类加载->链接->准备阶段赋零值,在JVM类加载->链接->初始化阶段赋初值
static final 在JVM类加载->链接->初始化阶段赋初值
涉及的问题:
初始化阶段对字节码的读取是按顺序的,故静态语句块只能访问到定义在它之前的类变量 static
final变量在编译时不定的情况下,如果客户程序这个时候访问了该类的静态变量,那就会对类进行初始化,所以静态final变量尽量不要放可变因素在里面,否则性能会有所下降。
对于类使用的静态字段,只会初始化定义该字段的类(如定义在父类中,不初始化子类。是否会触发子类的加载和验证,虚拟机规范没有明确规定,视虚拟机具体实现而定)
class ParentClass{
protected static Integer variable =1;
static{
System.out.println("parent before staticblock");
}
{
System.out.println("parent before block");
}
public ParentClass() {
System.out.println("parent constructor");
}
static{
System.out.println("parent after staticblock");
}
}
class SubClass extends ParentClass{
static{
System.out.println("sub before staticblock");
}
{
System.out.println("sub before block");
}
public SubClass() {
System.out.println("sub constructor");
}
static{
System.out.println("sub after staticblock");
}
}
public class CLassExecuteTest {
public static void main(String[] args) {
System.out.println(SubClass.variable);
}
}
输出:
parent before staticblock
parent after staticblock
1
JVM的相关知识整理和学习 - ImportNew http://www.importnew.com/16388.html