版权声明:这个系列的文章都是看了别人的文章有感而发创作的,所谓"知识没有抄袭之说",如果有人发现雷同或属巧合或属非巧合,不过不过本人绝对不屑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
分享到:
相关推荐
例如,JFlex是一个基于正则表达式的词法分析器生成器,它能根据用户定义的模式生成Java代码。 词法分析的过程通常包括以下步骤: 1. **字符流读取**:首先,词法分析器从源代码文件中读取字符流。 2. **分词**:...
在 Java 语言中,代码块和静态代码块的加载顺序是严格按照类的加载顺序执行的。具体来说,类的加载顺序如下: 1. 父类静态代码块 2. 子类静态代码块 3. 父类实例代码块 4. 子类实例代码块 在上面的实例代码中,...
这个"java代码的初始化顺序demo"显然旨在演示这一过程。让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载阶段**: 在Java程序运行时,JVM会先加载类的字节码文件(.class文件)。这个过程包括加载、...
在Java编程中,类是构建程序的基本构造块...总之,理解Java类的运行顺序对于编写高质量的Java代码至关重要。熟练掌握这些概念和工具,可以帮助开发者更好地优化程序性能,避免潜在的问题,提高代码的可读性和可维护性。
Java静态代码块作用及执行顺序解析 Java静态代码块是Java语言中的一种特殊代码块,它们在类加载的时候执行,且只执行一次。它们通常用来初始化静态变量、设置静态变量的初始值等。静态代码块的作用域是整个类,而...
Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...
本资源“算法分析Java代码”是一个针对算法学习者的宝贵资料,它提供了多种算法的Java实现,包括动态规划、回溯法和分支限界法。这些方法是计算机科学中的重要工具,广泛应用于优化问题、搜索问题以及复杂问题的求解...
Java代码块与代码加载顺序原理详解 Java代码块是Java语言中的一种基本结构单元,用于组织代码,控制变量的生命周期和作用域。本文将详细介绍Java代码块的类型、特点、使用方法和加载顺序原理。 一、代码块的类型 ...
【多媒体展示系统java代码】是一种基于Java编程语言开发的客户端/服务器(C/S)架构的多媒体展示应用程序。这个系统,被称为“网络游鱼”,利用了Java的网络编程能力,特别是用户数据报协议(UDP)来传输数据,这在处理...
在Java编程语言中,了解代码块的执行顺序对于编写高效且无错的代码至关重要。这里我们将深入探讨Java中的普通代码块(实例初始化块)和静态代码块的执行顺序,并通过实例来阐述这一概念。 首先,我们需要明白两种...
- **顺序图(Sequence Diagram)**:描述对象间交互的时间顺序,以垂直时间轴表示,显示消息传递和执行顺序,有助于理解系统行为。 **3. 使用ModelGoon生成UML图** - 安装ModelGoon插件:访问Eclipse Marketplace,...
在Java中,注解通过`@AnnotationName`的形式来声明,它们本身不直接影响程序的执行,但可以用于代码的验证、编译时的检查、运行时的行为修改等。 标题中的“java简单方法顺序调用注解”是指使用注解来控制类中方法...
FindBugs是一款开源的静态代码分析工具,用于检测Java代码中的潜在错误和不良实践。它通过分析字节码来查找可能的问题,而不是在运行时进行检查,因此可以在早期发现代码中的问题,避免它们成为难以调试的bug。...
顺序存储结构线性表的java实现代码,要在jdk1.6以上环境下运行
1. **UDoc.jar**:这是UDoc的可执行JAR文件,包含了所有必要的类和资源,可以直接运行来分析Java代码并生成UML图。 2. **licence.txt**:这是UDoc的许可协议,详细规定了软件的使用条件和版权信息。 3. **changelog....
### Java代码规范详解 #### 一、引言 在软件开发过程中,良好的编码规范是非常重要的。这不仅仅是为了提高代码的可读性和可维护性,也是为了确保团队成员之间能够更加高效地协作。本文将根据提供的《Java代码规范....
具体到Java实现上,可以通过定义符号表类来跟踪变量的作用域和类型信息,利用语法分析树(AST)进行深度遍历来执行语义检查。此外,为了解决歧义,可以采用预测分析技术,根据上下文确定操作符的正确解析顺序。 ###...
在Java代码中,可能需要为每个进程分配一个优先级,然后使用优先级队列数据结构来组织和调度进程。 在Java中实现这些调度算法,通常会涉及到数据结构如链表或队列,用于存储和管理进程状态,以及一些辅助方法来模拟...
本资源包"JAVA代码、方法、运算符大全"是针对Java初学者和进阶者的一份宝贵资料,它涵盖了Java编程中的核心元素:代码、方法和运算符。 一、Java代码 Java代码是实现特定功能的指令集合,它由类(Class)、方法...
Android代码块执行顺序分析总结 Android代码块执行顺序是指在Java中,代码块、变量、方法的加载顺序是一个重要的知识点,对于Android开发者来说尤其重要。本文将详细介绍Android代码块执行顺序的分析总结。 一、...