`

Java代码执行顺序分析

阅读更多

 

 

版权声明:这个系列的文章都是看了别人的文章有感而发创作的,所谓"知识没有抄袭之说",如果有人发现雷同或属巧合或属非巧合,不过不过本人绝对不屑copy然后paste的勾当,那样只会产生信息的冗余。

朋友们装载请记得注明出处!

 

 

 

记得胡哥曾经说过,想弄懂新的技术点有两条路:一 自己假设然后验证然后调整你的假设再验证;二  看别人现成的然后记住。今天我选了第一条路来挖掘“Java代码的执行顺序”这个主题的东东。

 

 

第一步:初步测试  静态块、普通块、静态方法、main方法、构造函数执行顺序。

 

 

Exm1-Exm8 所有源码见附件!

 

Main方法在父类中:


 

Exm1:子类在父类的内部

console:

 

Exm2:子类在父类外部

console:

 



Main方法在子类中:

 

 

Exm3:子类在父类内部

console:

 

Exm4:子类在父类外部

console:

 


Main方法在第三方类中:

 

 

Exm5:子类在父类外部

console:

 



测试静态方法

 

 

Exm6:mian方法在子类中

console:

 

 

 

分析实验结果

 

1、先加载先加载静态部分,后加载非静态部分。(注意main是静态方法)

2、调用构造函数的时候:先父后子;先执行独立的非静态代码块,后执行构造方法。

3、Main方法总是等加载完本类的静态方法之后执行。

4、如果main方法中有方法调用非main方法所在类中的构造函数,执行的顺序将是:

从最‘老’的父类开始,先加载完所有static block ,然后才是最‘老’父类的构造函数。

 

 

 

 

 

如果要我总结

 

1、方法、块对应静态和普通两个级别,如果不产生实例,就只执行静态部分,所有关联类中的静态部分总先于非静态部分执行。

2、静态部分中再分:静态块先于静态方法。非静态部分中构造函数再分:父类先于子类。(非静态部分中的方法,构造函数也没什么特别,构造函数和普通函数的却别就是super父类方法而已)

 

如果要我加上静态变量

 

 

 

Exm7:Dog类有两个int 、Poddle两个类型静态变量

console:

 

 

并没有违背我上面总结的两点,无非就是静态变量的实例化在所有静态块之前。

 

 

 

 



--------------------第二步:大胆猜测 ----------------

 

 

 

JVM将静态的(属性、方法、独立块)和非静态的分开处理。

鉴于JVM有类加载和实例化两个阶段。我大胆猜测,所有静态部分属于类加载阶段,所有非静态部分属于实例化阶段。而类加载总是先于实例化的。

类加载阶段分两步:

     1、找到main方法中所在类静态属性,如果'new'了就实例化,如果是基本数据类型有赋值就用,否则用缺省值。

     2、找到main方法中所在类的静态块执行。

-----------------------------main方法分割线----------------------------------------------

     3、从找到第一个构造函数。(不一定在main方法中声明,也许通过外部方法调用)

     4、找到构造函数对应类的继承体系,加载所有静态属性和静态块(如果之前已经加载将不重复加载)。然后从最初的类开始调用构造函数(调用构造函数之前会执行普通独立块)。(如果这一步不是构造函数是静态方法,将按同样的顺序加载静态部分)

 5、找到下一个构造函数,如果找到,返回第4步;如果没找到,结束。

 

 

 



测试我的猜想

 

 

 

 

Exm8:

console:

exe static block in Poddle!

exe common block in Dog!

exe Dog contructor!

exe common block in Poddle!

exe Poddle contructor!   ---前五行加载main方法所在类中的静态属性

exe static block in Dog!

 

------------main方法分割线--------------

 

exe main method!   i:10  s1:ssss  s2:aaaa  p:exe toString() in Poddle!--main方法

exe common block in Dog!

exe Dog contructor!

exe common block in Poddle!

exe Poddle contructor!---实例化Poddle 

exe static block in Shepherd_dog!

exe common block in Dog!

exe Dog contructor!

exe common block in Shepherd_dog!

exe Shepherd_dog contructor!---实例化Shepherd_dog

 

 

 


--------------------------第三步:收工~~~----------

 

 

 

 

不要嫌我啰嗦,这次真的不多说了^-^:

 

 


 

 

 

 

 

 

PS:本文有误,现更正如下:

对单个类,JVM加载阶段(编译阶段):

1、给静态变量分配内存空间

2、用默认值初始化静态变量

3、按照静态变量和静态块的申明顺序执行初始化

4、如果创建对象;否则,直接结束

5、先给所有实例成员分配内存空间并用默认值初始化

6、按顺序执行实例块和变量

7、执行构造方法


如果是一个多类的应用程序,静态部部分只有在编译阶段生成类唯一的Class对象时加载一次。

并且,如果要创建子类对象,总是默认调用父类的无参构造器(除非显示调用父类构造器)。

因为如果父类的一些成员没有加载,直接加载子类根本不符合"父生子"的规律,并且实际上也

会引起混乱(如父类protected变量没有初始化,却在先加载子类是使用到了,到哪里去找呢?

内存中都还没有加载到?)

 

 

 

 

 

 

 

 

 

  • 大小: 22.1 KB
  • 大小: 10.6 KB
  • 大小: 12.6 KB
  • 大小: 17.5 KB
  • 大小: 17.5 KB
  • 大小: 18.6 KB
  • 大小: 7.8 KB
  • 大小: 12.8 KB
分享到:
评论
5 楼 freish 2010-12-23  
liaofeng_xiao 写道
cantellow 写道
分析的精神值得赞赏
但是,当你看到了《深入java虚拟机》这一本书之后,你就都全明白了。

跟楼上一样,推荐你看《深入Java虚拟机》

ps:不知道为啥那么多人说这本书翻译的差
起初看的时候有同感,后来发现这本书翻译得无比好




看第一遍确实觉得很难受,看第二遍第三遍就好多了
4 楼 cantellow 2010-12-23  
liaofeng_xiao 写道
cantellow 写道
分析的精神值得赞赏
但是,当你看到了《深入java虚拟机》这一本书之后,你就都全明白了。

跟楼上一样,推荐你看《深入Java虚拟机》

ps:不知道为啥那么多人说这本书翻译的差
起初看的时候有同感,后来发现这本书翻译得无比好

曹晓刚看到的话,肯定不是滋味吧。
另,其实我根本没看完LZ写的什么,因为你的排版实在不敢恭维。
3 楼 贾懂凯 2010-12-23  
cantellow 写道
分析的精神值得赞赏
但是,当你看到了《深入java虚拟机》这一本书之后,你就都全明白了。

呵呵~我也明白看别人的书会学的快,不过有的时候自己分析分析也是种乐趣。
2 楼 liaofeng_xiao 2010-12-23  
cantellow 写道
分析的精神值得赞赏
但是,当你看到了《深入java虚拟机》这一本书之后,你就都全明白了。

跟楼上一样,推荐你看《深入Java虚拟机》

ps:不知道为啥那么多人说这本书翻译的差
起初看的时候有同感,后来发现这本书翻译得无比好
1 楼 cantellow 2010-12-23  
分析的精神值得赞赏
但是,当你看到了《深入java虚拟机》这一本书之后,你就都全明白了。

相关推荐

    Java静态代码块作用及执行顺序解析

    主要介绍了Java静态代码块作用及执行顺序解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    顺序线性表的java实现代码

    顺序存储结构线性表的java实现代码,要在jdk1.6以上环境下运行

    java 代码块与静态代码块加载顺序

    主要介绍了java 代码块与静态代码块加载顺序的相关资料,需要的朋友可以参考下

    Java 普通代码块静态代码块执行顺序(实例讲解)

    下面小编就为大家带来一篇Java 普通代码块静态代码块执行顺序(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    由浅入深详解Java 类的实例化顺序

    java教程 由浅入深详解Java 类的实例化顺序 在子类对象被实例化的过程中,变量、构造方法以及代码块三者的先后顺序为: 1. 父类的静态变量和静态代码块,按代码先后顺序执行 2. 子类的静态变量和静态代码块,按...

    Java:静态代码块和构造函数执行顺序

    /*大体上顺序是这样的:(也可以说是优先级,同一级的按顺序执行)  1 静态变量,静态代码块(类加载时执行,类不加载不执行)  2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行)  3 构造函数,...

    控制台展示执行顺序

    使用java控制台展示执行顺序,很不错的。

    Java开发技术大全(500个源代码).

    代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。 HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载...

    Java课件以及代码

     运行时错误  Can't find class HelloWorldApp • 系统找不到名为HelloWorldApp的类文件。  In class HelloWorldApp: main must be public and static • main()方法的左侧缺少static或public  文件中含有的...

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    java中静态代码块与构造方法的执行顺序判断

    对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。

    读取百万级数据量的xlsx文件的java代码

    文件里包含可以运行起来的项目,下载下来解压后,引入项目就可以运行看结果了。该代码可以处理100万数据量的excel文件,xlsx文件数据量太大,用普通的读法会报内存溢出错误,所以用官网提供的方法,一条一条的读取大...

    实例解析JAVA中代码的加载顺序

    主要介绍了举例说明Java中代码块的执行顺序,需要的朋友可以参考下

    java队列模拟实现

    这是一个java队列实现的全部工程文件,包含了所有代码,具体的设计文档在上传的另外文件中。这个工程能够实现所有队列的操作,运行没有问题。设计的是在应用程序上的基于界面的队列操作的实现。

    其实你应该这样学Java 源代码

    第一部分讲解了Java的基本特点和运行原理,Java虚拟机和JDK+JCreator的开发环境,Java程序代码的特点,Java语言中的运算符和表达式,Java的基本数据类型,Java语句流程,如顺序语句、选择语句、循环语句、跳转语句等...

    快速排序java代码

    快速排序算法,可以运行,运行截图一并打包,分享给大家。

    举例说明Java中代码块的执行顺序

    主要介绍了举例说明Java中代码块的执行顺序,包括静态属性和非静态属性以及构造函数等相关的执行先后,需要的朋友可以参考下

    java流程自动化工具

    三、应用部署:GIT代码拉取,MAVEN打包,SFTP上传,Linux脚本执行,自动化一气呵成,且轻松实现切换用户等交互性需求,数据初始化,多应用的启动顺序或特定条件触发,均可实现自动化操作。 四、模拟操作:接口调试,...

    java jdk实列宝典 光盘源代码

    applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容java的web浏览器中运行的程序;...

    浅谈Java文件执行顺序、main程序入口的理解

    主要介绍了Java文件执行顺序、main程序入口的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Global site tag (gtag.js) - Google Analytics