一个类被使用到的时候才会被加载,那么在加载一个类的时候会去执行初始化操作么?还是说,加载类的时候可以延迟执行初始化操作?
例如:
public class A{
     public static int a=0;
}
在类被加载的时候,a=0会不会执行?一个类被使用的时候一般分为三个步骤:
1:加载类
2:分配空间
3:初始化

解决方案 »

  1.   

    不知道你所谓的初始化操作是指什么?public class A{
      public static int a=0;
    }
    在类被加载的时候,a=0会不会执行?
    对于这段代码来说,a=0会执行
    也就是类加载的时候,static块都会被执行,static方法会加载到方法区
    所谓static块,比如
    class A {
        static { //在类中,用static加花括号括起来的代码叫static块,这些是类加载时执行
            System.out.println("我是static块");
        }
    }
    对于static a = 0;可以看作
    static a; //定义
    static {a = 0;} //赋值
    2条语句
    一个类被使用的时候一般分为三个步骤:
    1:加载类
    2:分配空间
    3:初始化一个类的使用,你是指什么使用,使调用静态方法,访问静态属性,还是调用构造方法?
    在上述说的三种使用中,如果类还没有被加载,都会先加载类所谓分配空间,又是指什么的分配空间?
    如果是类对象(也就是Class对象)的分配空间,那么加载类之前,就先为类对象分配空间
    如果是指实例对象的分配空间,那么如果类还没有被加载,就在类加载结束以后给对象分配空间初始化是指什么初始化,是static块初始化还是实例对象初始化?
    static初始化,就是上面说的static块,这些是在类加载的时候执行还有一种是实例初始化块,如
    class A {
        { //这里和static块的区别就是,花括号前面没有static,
           //那么在实例初始化的时候(构造方法调用以前)会执行
            System.out.println("我是实例初始化块");
        }
    }
    在生成对象实例的时候,先执行初始化块,然后执行构造方法所以,LZ所谓的延迟执行,如果是对象初始化,应该没有这一说,应为生成实例就会执行初始化,除非没有在初始化块或构造方法执行相应的操作,把它放到某个方法里,通过调用方法来达到所谓的延迟执行对于类加载来说,有所谓的延迟执行,就是把初始化工作交给另一个类的static块或方法来完成,这样,因为会需要先加载另一个类,而达到所谓的延迟