搜索
简帛阁>技术文章>java程序执行顺序

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程序执行顺序问题,今天,自己写了个测试,果然与自己考虑的有差距测试代码:一个父类Animal一个子类Dog测试类Test运行结果:所以执行顺序是:父类Animal静态代
Java中,new一个类的对象,类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父类。public
new一个对象时:静态代码块普通代码块构造方法普通方法publicclassMain{publicstaticvoidmain(String[]args){AppleapplenewApple();a
坑死我了,原来@Before会执行多次。通过函数名可以实现顺序执行执行顺序和函数的位置无关。importorgjunitBefore;importorgjunitBeforeClass;impor
在运行一个Java程序时,分为类加载过程和实例化过程,即static修饰的代码块、属性、声明为类加载,类的普通属性、代码块、构造器为实例化过程。其中类加载的代码属于整个类,只执行一次;而实例化过程中的
在我们通过JVM编译Java后缀名的文件时,JVM首先寻找入口(main方法)publicstaticvoidmain(String[]args)1、由于在入口时,未调用任何对象,该方法只能设置为st
classcode{publiccode(){Systemoutprintln("hello");}}publicclassTest{static{Systemoutprintln("静态代码块");
函数的声明和调用JavaScript是一种描述型脚本语言,由浏览器进行动态的解析与执行。函数的定义方式大体有以下两种,浏览器对于不同的方式有不同的解析顺序。代码如下:代码如下://“定义式”函数定义f
先搜索BEGIN语句,搜到则执行,否则执行程序的第一行2碰到函数定义,类定义,模块定义则执行,导致这些东西被定义3碰到导致程序退出的语句,或者到了文件结尾或者遇到__END__则退出执行4在退出执行
代码解析子类packagecom;/***子类*@authorhuage**/publicclassTestextendsTest1{publicstaticvoidmain(String[]args