您的位置:首页 > 编程语言

静态代码块的加载时机及JVM的理解

2018-03-16 00:29 330 查看
学习自:http://blog.csdn.net/jiese1990/article/details/40154329

class MyClass1 {  
    static {//静态块  
        System.out.println("static block ");  
    }  
}  
public class Main {  
  
    Class[] classArray = {  
            MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中  
    };  
    public static void main(String[] args){  
        System.out.println("hello word");  
    }  
  
}  
这个例子,是入口。但是不会创建一个Main对象,也就没有了把成员变量提取到构造方法之前初始化这么一说,所以

 Class[] classArray = {  
            MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中  
    };  
就不会被执行到。这个demo测试就有问题了。把这个Class数组声明成静态就可以了。

然后MyClass1.class就会出发了这个类的第一步,加载



所以静态代码块不会得到执行性。
还有一种情况也不会得到执行。当你Class.forName(对象详细路径),这个时候是会触发到初始化的。但是你可以通过设置一个标记位为false
Class.forName("A",false,this.getClass().getClassLoader())

这样就不会进行初始化了。

最后JVM角度捋一捋
1.装载
通过类的完全限定名,生成二进制流
解析二进制流为方法区的内部数据结构
创建Class实例
2.连接
验证语义和符号引用
分配内存
解析,常量池寻找可替换引用
3.初始化:当类被主动使用
主动使用的情形:
创建实例
调用静态方法、字段
反射
初始化某个子类
启动包含main方法的类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: