锁定老帖子 主题:类的加载过程
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间: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); //由于编译的时候不确定具体的值,所以会加载类 } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 1815 次