java类的初始化过程

转自http://blog.csdn.net/monghuan/article/details/7404670

一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。

一.类加载时,变量的初始化顺序:
 1.首先,给静态成员变量分配内存空间,进行默认初始化
  (整型为0,浮点型为0.0,布尔型为false,字符型为‘\u0000‘,引用型为null)
  
 2.其次,执行静态成员变量的初始化操作
  --静态成员的初始化,包括两种: 声明时直接初始化和静态代码块
  --执行顺序为:在代码中的出现的顺序(声明的顺序)
  
 注意: 1和2的动作,在类加载时只执行一次!!!!!!!

如果创建了对象,则在堆中给类的实例分配内存空间,
 3.首先,对实例变量,进行默认初始化
  (整型为0,浮点型为0.0,布尔型为false,字符型为‘\u0000‘,引用型为null)
  
 4.其次,执行实例变量的初始化操作
  --实例变量的初始化,使用前2种初始化方式: 声明时直接初始化和代码块
  --执行顺序为:在代码中的出现的顺序(声明的顺序)
 
 5.最后,执行构造函数(实例变量的第3中初始化方式)
 
二.继承时,变量的初始化顺序:
 1.当类第一次使用时,JVM就会加载该类,如果该类存在父类,那么就先加载父类,这是一个递归过程,直到Object为止.
 在类加载中,首先进行静态成员变量按照默认值进行初始化,
 然后按照在类中声明的顺序执行静态代码块和静态变量的显示初始化.
 这个过程从父类到子类,并且只会执行一次!!!
 
 2.当父类与子类的静态代码初始化完成后,如果创建了类的对象,
 在初始化子类前,会先对其父类的实例变量进行默认初始化,
 然后按照在类中的声明顺序来执行代码块与实例变量的显示初始化,
 最后调用父类的构造函数,这也是一个递归过程,直到Object类为止.
 (这个过程在每次创建对象时,都会执行!!!)

时间: 2024-08-18 10:48:36

java类的初始化过程的相关文章

Java类的初始化过程及清理

一.类的数据成员初始化 Java中类的数据成员初试化可能有两种形式. 在定义类成员变量的地方直接提供初始化值(这是C++中不允许的) 在构造器中初试化.(Java中不存在类似C++中的初始化列表) 两者的区别是,第一种方式是数据成员直接初试化为提供的初始化值,而在构造器中初始化,其实在数据成员已经初试化为默认值(比如基本类型如int 初始化为0,引用类型初试为null,其实在在构造器已经不能称为初始化了,应该是赋值) 初始化顺序 如果有静态变量则先初始化静态变量,如果基类中也有静态变量且之前没有

【深入理解Java虚拟机】类的初始化过程

类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的默认值,比如int初始化为0,reference初始化为null) 但是达到类的初始化之前都没有初始化为真正的值. 零值.png 解析 将符号引用转换为直接引用 初始化 搜集并执行static代码块,以及 方法的执行, 是静态变量以及static 代码块组成 使用 为新对象申请内存, 为示例变量初始

java代码的初始化过程研究

刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻--)但是博主写的不够详细具体,我想在这详细谈一下java代码的具体初始化过程. 首先要清楚,初始化分为两个过程:类初始化.对象初始化. 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程,也就是有static修饰的变量.对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了.比如int类型就是0

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java中的初始化过程(转)

原文:http://www.cnblogs.com/mmbo/archive/2009/10/05/1578156.html 1.类成员自动初始化,基本类型总是最先初始化为0(boolean为false,(char)0),对象的引用初始化为null:2.类成员指定初始化,可以在类成员定义或构造器(包括其他方法)中给基本类型和非基本类型对象初始化,但这并不能阻止自动初始化首先进行:3.按类成员定义的顺序决定初始化的顺序:4.静态成员只有在第一次被访问时(class对象首次加载)才会被初始化,此后不

Java常见问题之初始化过程

假设有个名为Dog的类 对于静态字段: 1. 当首次创建类型为Dog的对象时,或者Dog类的静态字段/静态方法首次被访问时,Java解释器会查找类路径,以定位Dog.class文件. 2. 载入Dog.class,此时初始化所有静态字段,如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null. 对于非静态字段: 1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字

[Java] 类的初始化步骤

前言 类的初始化过程,可在多线程环境下进行的,为了简化,本文介绍的单线程情况下的类初始化步骤. 此外,继承情况下的顺序不是本文焦点,本文重点在于一个类的内部字段的初始化顺序. "初始化" 一词,专门针对一个类而言.一个实例被创建过程中,实例字段被初始赋值,不称为初始化,而是直接称作实例的创建,以示区分. 正文 类的初始化,包括静态代码块的初始化.静态字段(类的字段)的初始化. 类的初始化触发条件: 1) T 是一个类,且 T 的一个实例被创建. 2) T 的一个静态方法被调用 3) T

Java类的初始化

Java提供了两种不同的初始化类型,分别是类的初始化和对象的初始化.类成员都是静态的,默认会设置一个值.对象的初始化会在构造函数里面进行.但如果想要赋给静态变量非默认值,或者是初始化一类共有的对象属性(不论调用哪个构造函数),那么就需要一些特殊的方法.提供了静态初始化块和非静态初始化块来处理这两种情况. 静态初始化块 静态初始化块是通过static{}来定义的.一个简单的代码示例如下: public class CorderStatic { staticint idx; static{ Syst

java 类 及其 执行过程

java 类 命名 java类文件中  只能有一个公开类  且 公开类类名与当前类文件的文件名一致 方法如果使用了static修饰,那么此方法是类方法,可以 类名.方法名 使用. 你的main方法在同一个类中,那么不需要写类名,直接写方法名就可以调用. 而没有使用static修饰的方法属于实例方法,必须创建此类的对象,通过对象调用此方法.如: Func2 f = new Func2(); f.shuchu(4,4); public class HelloWorld{ /** * main方法作为