类加载
类加载的3个过程
类加载器
1,加载
将class文件字节码内容加载到内存中(字节码的来源很多) 并将这些静态的数据转换成方法区中运行是的数据结构(二进制的数据),在堆中生存一个代表这个类的java.lang.Class对象,作为方法区类数据访问入口
2,链接
将java类的二进制代码合并到jvm的运行状态之中的过程
1),验证:
确保加载的类信息符合jvm的规范,没有安全方面的问题
2),准备:
正式为类变量(static变量)分配内存 并且设置类变量初始化值(全部都是初始默认值),这些内存都在方法区中进行
3),解析
虚拟机常量池的符号引用代替换为直接引用的过程int a = 1;转换为直接引用
3, 初始化
1),初始化就是执行类类构造器<clinit>()方法的过程,类构造器<clinit>()方法由编译器自动收集类中所有类的变量的赋值动作和静态的语句块(static)的语句合并。
2),初始化的时候,如果发现父类没有初始化,则需要先对父类初始化。
3),虚拟机会保证一个类的<clinit>()方法在多线程的环境下 被正确的枷锁同步。
4),当访问一个类的静态域的时候,只有真正声明这个域的类才会被初始化。
/**
* 类加载的过程
* 首先类加载 将变量和static静态代码块放到类的初始化的方法里面,初始化之后才new对象,执行static
* @author Administrator
*
*/
public class Demo01 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.width);
}
}
class A{
public static int width = 100;
static{
System.out.println("initialized model A");
width = 300;
}
public A(){
System.out.println("generating A object");
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。