java程序执行顺序
原来自己一直都没弄明白Java程序的执行顺序问题,今天,自己写了个测试,果然与自己考虑的有差距
测试代码:
一个父类Animal

一个子类Dog

测试类Test

运行结果:

所以执行顺序是:
父类Animal静态代码块->子类Dog静态代码块->父类Animal非静态代码块->父类Animal构造函数->子类Dog非静态代码块->子类Dog构造函数
探索:为啥是这样的执行顺序
我们首先来看如果不使用继承会是怎样的结果:

静态代码块-->非静态代码块-->构造函数
静态代码块,随着类的加载而执行,只执行一次,并优先于主函数执行,是对类初始化的。
非静态代码块,作用:给所有对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
代码块是给所有对象进行统一初始化,
而构造函数是给对应的对象初始化。
代码块中定义的是不同对象共性的初始化内容。
我们再来看继承之后的,
1.Test中main方法内的new会触发JVM对类的加载,因为Dog是继承了Animal的,所以,先加载Animal,
执行所有的static域的初始化语句或者初始化块(按出现的顺序),此时Animal内static块的打印语句执行了;
父类的方法表建立后算是父类加载完毕,接着会加载子类Dog,执行的过程与父类类似。因为子类没有static的数据域,所以仅仅static的初始化块内的打印语句执行;
(static的初始化只有一次,因为它仅仅在类加载的时候执行而与实例化没有关系)
2.需要的类加载完毕之后new Dog()开始使用类构造器创建实例
执行父类的非静态代码块,进行初始化,
然后执行父类构造器(super()...)
执行子类非静态代码块
执行子类构造器
所以综上所述,就会出现如下执行结果:

总结:静态代码块总是最先执行。
非静态代码块跟非静态方法一样,跟对象有关。只不过非静态代码块在构造函数之前执行。
父类非静态代码块、构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数
java程序执行顺序的更多相关文章
- [转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序
本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过. 一.JAVA中执行顺序 静态块 块 构造器 父类构造器 二.JAVA中赋值顺序 静态块直接赋值 块直接赋值 父类继承的属性已赋值 静态变量 ...
- 一个例子搞清楚Java程序执行顺序
当我们new一个GirlFriend时,我们都做了什么? 一个例子搞懂Java程序运行顺序 public class Girl { Person person = new Person("G ...
- 深入了解Java程序执行顺序
Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独 ...
- 深入了解类加载过程及Java程序执行顺序
前言 在Java中,静态 Static关键字使用十分常见 本文全面 & 详细解析静态 Static关键字,希望你们会喜欢 目录 1. 定义 一种 表示静态属性的 关键字 / 修饰符 2. 作用 ...
- JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)
总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...
- java 程序执行顺序之继承
1.首先会初始化父类,因为没有父类子类也无从谈起.第一步初始化static 变量 或者 静态初始化话块 2.初始化子类的static 变量 或者 静态初始化块 3.顺序初始化父类普通变量 或者 父类普 ...
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- PHPWind 8.7中代码结构与程序执行顺序
pw9在此不谈,他是完全重构的作品,是完全MVC下的体系.当然,其中很多东西在PW8.7下已经可见端倪. 主要代码结构 1. 以现代的观点,PW是多入口应用模式,程序根目录下的文件几乎都是入口: 2. ...
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)
1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...
随机推荐
- struts2中的json
这里放一个转载的struts2中json的详细应用和范例, http://yshjava.iteye.com/blog/1333104,这是个人在网上看到的很用心也很详细的一份关于struts2中js ...
- Widget only supports Widgets as children
Widget only supports Widgets as children https://www.baidu.com/s?wd=Widget%20only%20supports%20Widge ...
- 理解js中的原型链,prototype与__proto__的关系
说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Pers ...
- Runtime 10种用法
来源:haojingxue_iOS 链接:http://www.jianshu.com/p/3182646001d1 阅读了多篇运行时的文章,感觉都很不错,从几篇文章里面提取一些个人认为比较重要的,偏 ...
- jboss7的服务器开启和关闭命令
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 教你50招提升ASP.NET性能(十二):在生产环境,仔细考虑你需要记录哪些日志
(18)When in production, carefully consider what you need to log 招数18: 在生产环境,仔细考虑你需要记录哪些日志 Many peopl ...
- .@RequestMapping 使用方法
1.@RequestMapping 使用方法 SpringMVC中,@RequestMapping用来处理请求,比方XXX.do @RequestMapping("/aaa") ...
- 采用Reflector的VS.net插件断点调试无源码DLL 分类:
.Net的编程利器Reflector可以反编译基于.net开发的应用程序和DLL,其功能强大不用多说.今天想试验一把利用VS.net的插件断点调试外部无源码的DLL(只要是程序集都可以,所以exe也行 ...
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
2257: [Jsoi2009]瓶子和燃料 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- HDU 5071 Chat(2014鞍山B,模拟)
http://acm.hdu.edu.cn/showproblem.php?pid=5071 Chat Time Limit: 2000/1000 MS (Java/Others) Memory ...