Java程序初始化顺序

    今天在课上复习了Java的初始化顺序,一直有点疑惑,搞不明白,所以打算写下来,记录一下。


  先说一下Java程序初始化的顺序:父类静态变量>父类静态代码块>子类静态变量>子类静态代码块>父类非静态变量>父类非静态代码块>父类构造器>子类非静态变量>子类非静态代码块>子类构造器。


Java程序初始化一般遵循3个原则

1.静态对象(变量)先于非静态对象(变量)初始化。其中静态对象(变量)只初始化一次,因为static在jvm中只有一块区域存储,方法区(Method Area),他之所以被称为静态是因为从程序创建到死亡他的地址值都不会改变,他只在class类对象初次加载时初始化,因此static只需要初始化一次,而非静态对象(变量)可能会初始化很多次。

2.如果类之间存在继承关系,那么父类优先于子类进行初始化。

3.按照成员变量的定义顺序进行初始化。即使变量定义散布于方法之中,他们依然在任何方法(包括构造函数)被调用前先初始化。

接下来我们先来看来《Thinking in Java 》的代码示例:


在Card中,Tag对象的实例化故意到处散布,in order to 使得他们都在构造器进入或者发生其它任何事情之前得到初始化。除此之外,t3在构造器内部得到了重新的初始化。

下面我们来看看运行结果:

如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static值只有一个存储区域,所以无论创建了多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面来看一段《Thinking in Java 》代码:



注意在static定义之前,Cupboard已经实例化了一个非静态的b3.


大家拿出纸笔来算算会输出个什么个结果吗,你的思路是否还清晰呢,还是像笔者一样已经云里雾里了,好了不卖关子了,我们来看看输出的结果:


是否和你在纸上的答案一样呢?

我们来剖析一下这个程序,首先看main方法,main方法里首先会初始化静态对象t2,t3,在jvm的方法区里创建一个t2的静态对象,指向Table类,然后在创建一个t3的静态对象指向Cupboard.

然后程序继续运行到Table类里,初始化静态对象b1,跳转到Bowl类,执行Bowl的构造器,打印输出Bowl(1),进入bowl类,初始化静态对象b2,跳转到Bowl类,执行Bowl的构造器,打印输出Bowl(2),回到Table类,执行Table类的构造器,打印输出Table(),执行b2.f(1),打印输出f(1),此时,静态对象t2的任务已经完成了。

接下来时t3的任务,进入Cupboard类,初始化静态对象b4,跳转到Bowl类,打印输出Bowl(4),初始化静态对象b5,跳转到Bowl类,打印输出Bowl(5),初始化非静态对象b3,跳转到Bowl类,打印输出Bowl(3),然后执行Cupboard的构造器,打印输出Cupboard(),next,执行b4.f(2),打印输出f(2),此时静态对象t3的任务已经完成了。

回到main函数里,执行非静态变量,打印输出一个Creating new Cupboard() in main,在new一个Cupboard,初始化非静态对象b3,跳转到Bowl类,打印输出Bowl(3),然后执行Cupboard的构造器,打印输出Cupboard(),next,执行b4.f(2),打印输出f(2),然后继续打印一个Creating new Cupboard() in main,继续new一个Cupboard,初始化非静态对象b3,跳转到Bowl类,打印输出Bowl(3),然后执行Cupboard的构造器,打印输出Cupboard(),next,执行b4.f(2),打印输出f(2)。

最后执行t2.f2(1),t2指向的是Table类,所以打印输出f2(1),同理,t3.f3(3)打印输出f3(3).

到此为止,这段代码已经被我们解剖的清清楚楚了,所以对Java的初始化顺序应该印象更深了吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 类的加载与对象创建过程 Java中每个类的编译代码都存在于他自己的独立的文件中。该文件只在需要使用程序代码时才会被...
    Specime阅读 451评论 0 0
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,224评论 0 2
  • 整理总结 随着计算机革命的发展,“不安全”的编程方式已逐渐称为编程代价高昂的主因之一。其中,初始化与清理正是涉及安...
    信阳_856b阅读 188评论 0 0
  • 我还是会相信,星星会说话,石头会开花,穿过夏天的栅栏和冬天的风雪过后,你终会抵达。---饶雪漫《左耳终结》 工作至...
    piggy的小花园阅读 218评论 2 2
  • # 一起学思维导图 # 今天分享的导图【开启大脑的钥匙】 这是和我一起学思维导图的小伙伴写的,很精彩! 思维导图是...
    思维导图达人_桃子阅读 342评论 0 0