java全部对象初始化的执行顺序

java所有对象初始化的执行顺序

首先笼统地说一下java代码的初始化调用过程,首先进入代码解释器会找到main方法,然后加载staticInitiallization类进行扫描,扫描到里面所有的静态域和要调用的对象,然后给他们首先初始化一遍,如果对象里面还包含其他对象,那就按照这个规律再初始化一遍,也就是说没有调用的对象是不会自动初始化的(如果没有设定初始化默认初始化为null或者0)。

举个例子,如果我在构造器里面print一个helloworld,只有这个对象被main直接或者间接涉及才会print出来,不然是不会被调用的。

这个初始化的过程也是有先后顺序的,首先是对象里的静态,然后是非静态,然后是才构造器(毕竟构造器要涉及的东西比较多,所以移到后面也是可以理解的)。然后把这些都初始化了个遍才开始执行main里面的代码。

举个例子,如果我的对象里面有静态,非静态,构造器三种都有,而且被设计为都是new 一个带有print的对象(这样就能直观地看出来初始化顺序和是否被初始化),然后我进入main里面,首先会print -> 静态 -> 非静态 -> 构造器 ,然后如果程序里还要new一个我们的这个类,然后又要print -> 非静态 -> 构造器,这里注意两点。

1,从你创建到调用对象为止,对象至少被用作初始化过两遍,一次是进来时初始化的,一次是你new对象的时候给新的对象初始化的。

2,静态对象跟名字一样,除了一开始的第一次进来初始化之外,之后除非你主动撩拨她,不然人家是不会理你的,就像是暂住在这个类里面一样,这里的活动跟她无关,只有主动找她她才会被调用。而且要强调一下静态的特性,哪怕你类出了两三个对象,例如Dog1,Dog2,他们的静态也就那么一个,也就是说只要是Dog类的派生对象Dog1,Dog2分别对自己的静态Dog1 ->静态进行++,实际上是进行了+2的。


总结地说一下:

对象的创建过程如下,假设有一个名叫Dog的类:

1,构造器默认是静态的方法,虽然没有标志static。因此,当首次创建Dog对象或者调用Dog对象中的静态方法时,java解释器会查找Dog.Class的路径,然后给这个对象一个定位,以后找它就方便了。

2,然后载入Dog.class,有关静态初始化的所有动作都会执行。也就是如上面说的,静态的初始化只会在class对象首次加载的时候进行一次。

3,当用到new Dog()的创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。

4,给这块新开辟的存储空间清零,所有的类型都会被设置成0,引用变成null。

5,执行初始化动作,按照代码的要求按照静态,非静态,构造器顺序初始化。





PS:类跟对象其实是不同的东西,类是最原始的那个类,而对象是类派生出来的Dog1的那个类,叫做对象。