JVM(Java虚拟机)
类的加载,连接与初始化
加载:查找并加载类的二进制数据,即将类的.class文件中的二进制数据读入到内存中,将其放在运时数据区的方法区内,然后在堆区创建java.lang.Class对象,用来封装类
在方法区的内的数据结构。
连接:
验证:确保被加载的类正确性。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把类中的符号引用转换为直接引用(利用指针的指向引用)。
初始化:为类的静态变量赋予正确的初始值。
package com.java3;
class Text2
{
private static Text2 text2 =new Text2();
public static int count1;
public static int count2=0;
//private static Text2 text2 =new Text2();
private Text2()
{
count1++;
count2++;
}
public static Text2 getInstance()
{
return text2;
}
}
public class Text
{
public static void main(String[] args)
{
System.out.println("count1:"+Text2.count1);
System.out.println("count2:"+Text2.count2);
}
}
上面的一个简单的例子,可以类如一下,换成这样子的话:
//private static Text2 text2 =new Text2();
public static int count1;
public static int count2=0;
private static Text2 text2 =new Text2();
就是位置换了一下。结果是不相同的,读者可以尝试下。
两个类型的类加载器
1。Java虚拟机自带的类载器
根类加载器(Bootstrap) c++实现
扩展类加载器(Extension)
系统类加载器(System)
2。用户自定义的类加载器
java.lang.ClassLoader的子类
用户可以定制类的加载方式
类加载器采用的是父亲委托机制(Parent Delegation)
用户自定义类加载器-->系统类加载器-->扩展类加载器-->根类加载器
定义类加载器:
如果某个类加载器能够加载一个类就是定义类加载器
定义类加载器及其所有子加载器称为初始类加载器
每个类加载器都有自己的命名空间,命名空间由该加载器级所有父加载器所加载器的类组成。