论坛首页 入门技术论坛

类的加载过程

浏览 1815 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-05-06  

 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); //由于编译的时候不确定具体的值,所以会加载类

   }

}

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics