java的初始化顺序

一直以来,对初始化的顺序都是模棱两可,是知道大概的顺序,具体说也说不清,可能有的初学者也是这样,所以今天把初始化的过程写出来,以备自己查看。

首先,Java语言对初始化提供了一个保证,即:所有变量在使用前都能得到恰当的初始化。(对于局部变量只声明而未初始化的情形,Java会对之报错)要是类的数据成员是基本类型,Java会默认给其赋初始值(数字类型为0,char为空,布尔类型为false),而对象的引用则会获得一个null。在类的内部,定义变量的顺序决定了变量的初始化顺序,但是无论变量定义的位置在哪,都会在任何方法(包括构造器)被调用之前得到初始化。但是有个特殊的情况就是static数据,静态变量的初始化是优先 的无关定义的位置,然后才是非静态变量。而对象之间也是静态对象优先。

而 对于有继承的情况,会优先加载父类,如果父类还有父类,则一样,直到基类一直如此。

为了更形象化说明这个过程,我们假设有两个类Son,Father。Son类继承自Father类。

现在分析一下初始化的顺序。

(1)jvm试图访问Son.main()(入口方法),于是Java解释器必须查找类路径,以定位Son类的编译代码(Son.class),然后载入;

(2)加载过程中,编译器注意到Son还有一个基类(extends关键字得知),于是继续加载Father.class;

(3)此时基类(本例中也就是Father类)中的static初始化(也就是变量j的初始化),然后是下一个导出类(Son类)的 static初始化(也就是变量l的初始化),要注意的是static初始化只会初始化一次;

(4)至此为止,必要的类都已经加载完毕,对象可以被创建了,于是执行main(),打印hello;

(5)要创建实例son,首先对象中所有的基本类型都会被设初值,引用设为null,然后基类的构造器会被调用,在调用方法之前(构造器也是方法)会先初始化变量,所以i被初始化,执行基类构造器,至此基类构造器完成;

(6)实例变量按序列初始化,执行子类(Son)的构造器。

具体如下:





总结:其实看到打印的结果也就大概清楚了初始化的过程,总体来说有几点:static初始化,顺序是由基类到子类,然后就是实例化对象,包括初始化父类的实例变量,加载父类的构造器,初始化自身的实例变量,加载自身的构造器。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值