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 ...
随机推荐
- HW6.20
public class Solution { public static void main(String[] args) { int[][] chessboard = new int[8][8]; ...
- sublime text2注册码
----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC ...
- SpringMVC日期参数自动绑定
Controller: @RequestMapping("/addUser") public String addUser(User user) { ... } Model: pu ...
- [iOS基础控件 - 6.4] 汽车品牌展示 Model嵌套/KVC/TableView索引
A.需求 1.使用汽车品牌名称头字母为一个Model,汽车品牌为一个Model,头字母Model嵌套品牌Model 2.使用KVC进行Model封装赋值 3.展示头字母标题 4.展示索引(使用KVC代 ...
- 在多线程中进行UI操作
那么在子线程中的UI操作如何处理呢?有两种方法: 一:在子线程,你需要进行的UI操作前添加dispatch_async函数,即可将代码块中的工作转回到主线程 dispatch_async(dispat ...
- oracle表数据误删还原
首先,找到数据删除前的一个时间点. select timestamp_to_scn(to_timestamp('2013-10-12 8:30:00', 'YYYY-MM-DD HH24:MI:SS' ...
- MSSQLSERVER数据库- 慎用SELECT INTO复制表
很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些.但是要注意: SELECT INTO 复制表或表结构的时候, ...
- 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。
package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public ...
- 注入限制绕过<转>
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“'”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以 ...
- android学习日记03--常用控件ListView
常用控件 8.ListView 列表视图,比如游戏的排行榜.列表数据可以根据屏幕大小自适应 列表的显示需要三个元素: a.ListVeiw:用来展示列表的View. b.适配器:用来把数据映射到Lis ...