类的加载过程
Java中一个类的信息编译之后是存放在字节码文件中的(.class),运行的时候,如果虚拟机用到了这个类,它就会通过ClassPath找到这个字节码的文件,通过一个输入流,把其中的内容读入到虚拟机的内存中,从而获得这个类的信息,称为类加载
类的加栽只会进行一次,第一次用到这个类的时候
静态初始代码块在类加载的时候运行
类加载的时机:能不加载就不加载
1. 第一次new对象的时候,加载
2. 第一次访问static成员的时候,加载
3. 声明引用的时候,不会加载类
4. 加载字类会先加载父类
5. 如果通过子类访问父类的静态成员,只加载父类
6. 如果访问的是类的公开的静态常量,那么如果编译器在编译的时候能确定这个常量的值的时候,那么就不会加载,反之,编译器不能确定值的时候,就加载
Code:
class A
{
static int i=20;
static final int j=50;
static double x=Math.random()*1000;
A()
{
System.out.println("A的构造函数");
}
{
System.out.println("class A的初始化块");
}
static{
System.out.println("classA被加载");
}
}
class B extends A
{
B()
{
System.out.println("B的构造函数");
}
static
{
System.out.println("class b 被加载");
}
{
System.out.println("class b的初始化块");
}
}
class TestClassLoader
{
public static void main(String[] args)
{
A a; //声明一个引用的时候不加载类
a=new B(); //new 一个对象的时候被加载,先加载父类,后再加载子类
System.out.println(A.i); //当使用静态的成员变量的时候被加载
System.out.println(B.i); //通过子类去访问父类的静态成员的 时候,只加载父类
System.out.println(A.h); //由于是可确定的值,所以不加载类
System.out.println(A.x); //由于编译的时候不确定具体的值,所以会加载类
}
}